lilbee
The lilbee server provides a local AI-powered knowledge base and model management system. Here's what you can do:
Search & Knowledge Base
Search indexed documents using semantic (embedding-based) search across source chunks, wiki pages, or both
Add files, directories, or URLs to the knowledge base (with optional OCR for scanned documents/images)
Crawl websites recursively with configurable depth, page limits, and render mode (HTTP or Chromium/JS); poll crawl status via task ID
List, remove, and sync indexed documents with the vector store (force rebuild or retry skipped files)
Initialize a new local
.lilbee/knowledge base in any directoryReset the entire knowledge base (factory reset)
Model Management
List installed models filtered by source (native/remote) or task (chat, embedding, vision, rerank)
Browse a model catalog — curated list + live Hugging Face results, filterable and sortable
Pull (download) models with streaming progress; integrates with Ollama and LM Studio
Show metadata for a specific model and remove locally managed models
Settings & Configuration
List, get, set, and reset all configuration settings atomically (retrieval, generation, indexing, API keys, etc.), flushed to
config.tomlView status — indexed documents, chunk counts, and current configuration
Data Import/Export
Export indexed datasets (text chunks per page/source) to Parquet or JSONL
Import a dataset file, re-embedding it under the current model
Agent & Tool Integration
Exposes a REST API and functions as a Model Context Protocol (MCP) server, enabling AI agents and custom tools to interact with all capabilities above.
Allows browsing, downloading, and managing models from Hugging Face, with support for roles like chat, embedding, vision, and reranking.
Provides an Obsidian plugin for integrating lilbee's search capabilities directly within the Obsidian note-taking application.
Allows lilbee to use existing Ollama model setups, showing Ollama models alongside native ones for seamless integration.
lilbee runs and manages your models: chat, embedding, vision, and rerank, placed across every GPU you have. It puts them to work as a search engine you can talk to, over your files, notes, code, and the web, where every answer cites the exact file and line. It crawls websites into your library, launches your coding agents on local models, and hands any MCP-aware agent cited answers from everything you've indexed. The same engine backs the Obsidian community plugin, so your vault gets all of it without a terminal. Ask in plain English. No containers, no networking, nothing else to install or set up.
And it is private. Your files, the index, the embeddings, your questions, and the answers stay on your machine. lilbee sends no telemetry, needs no account, and makes no cloud call unless you configure a cloud model yourself.

It's all one program: no separate model server, vector database, or container to stand up. lilbee runs the models and keeps the index itself. Reach it as a terminal app, CLI, Model Context Protocol server, HTTP API, or Python library. Close it and it's gone, or run it as a service to keep it warm. Everything runs on your computer; it uses a cloud model only when you pick one.
Models are no different: lilbee has its own model manager and multi-GPU fleet, built on llama.cpp, so one executable does everything (browse Hugging Face, download a model, give it a role, run it on Metal / Vulkan / CUDA). You don't need Ollama or LM Studio at all: the architectures lilbee runs are behind most of the 190,000+ GGUF repos on Hugging Face, with representatives verified on real GPUs. If you already use them, point lilbee at your existing setup and keep your models.
Tutorial reel: every demo on this page, plus the extras that don't fit here, with long-form captions at lilbee.sh/tutorial.
⚠️ Beta software
lilbee is in active beta development. Every release on PyPI is a pre-release; you must use
--pre(or uv's--prerelease=allow) when installing. Interfaces, command names, and on-disk formats may shift between betas. Feedback, bug reports, and issues are very welcome; that's the whole point of the beta.Latest pre-release (always): lilbee on PyPI →
Tutorial reel (long-form videos)
Related MCP server: local_ai_gen
Install
Two routes, and the difference matters:
A self-contained bundle (start here): the standalone binary, or the Homebrew / AUR / Nix / Docker / Flatpak / Snap / Scoop builds that wrap it. It carries its own Python runtime,
llama.cpp, the model engine, and the optional extras, so there is nothing else to install and nothing to assemble. The trade-off is one large download and a small cold-start cost the first time it self-extracts.Into your own Python with
piporuv(Python 3.11 to 3.14), in its own section below. This is the developer route: it installs lilbee as a library in an environment you manage, and the model engine is a separate extra from a separate index that you have to ask for. Take it if you are working on lilbee or importing it into your own code.
Have a discrete GPU? The bundled builds and the Vulkan engine already use it. There are faster vendor builds too: NVIDIA (CUDA) and AMD (ROCm).
No external services either way; lilbee downloads and runs models locally. Optional, for scanned-PDF / image OCR: Tesseract (brew install tesseract / apt install tesseract-ocr) or a GGUF vision model.
How | Command | Notes |
Homebrew |
| macOS (Apple silicon and Intel) / Linux x86_64. Bundled build; clears the macOS quarantine flag for you. |
AUR |
| Arch Linux. Wraps the Linux x86_64 binary; works with |
Docker |
| GHCR image, tagged by version and |
Nix |
| NixOS, nix-darwin, or any host with nix. On Linux the flake bundles |
Flatpak |
| Linux x86_64, any distro with flatpak. Needs the Flathub remote for the runtime. Run with |
Snap |
| Linux x86_64. Sideloaded, so snapd flags it |
Scoop |
| Windows x86_64. Scoop needs git to add a bucket, so the first command installs it (a no-op when present). Reads your NVIDIA driver version and installs the matching CUDA build (555.85+ gets cu125, 551.61+ gets cu124), otherwise the Vulkan build. It says which one it picked. |
npm |
| macOS / Linux x86_64 / Windows, Node 18+. A small launcher: on first run it detects your hardware (CUDA, ROCm, Metal, or the AVX-baseline build), downloads the matching standalone binary of the latest release, verifies it, and caches it. |
Standalone binary | One file, own Python runtime, no |
On NVIDIA hardware
The default Vulkan build works on NVIDIA cards, but there's a dedicated CUDA build that's faster on NVIDIA hardware and sidesteps the iGPU + dGPU Vulkan-loader crash on Windows.
Command | |
Homebrew |
|
AUR |
|
Nix |
|
Flatpak |
|
Scoop |
|
Binary |
|
pip (devs) |
|
uv (devs) |
|
Same lilbee command after install. The CUDA runtime is bundled; you only need the NVIDIA driver. Already have the regular lilbee installed? On AUR paru -S lilbee-cuda swaps it automatically; on Homebrew run brew uninstall lilbee first, and on Scoop run scoop uninstall lilbee first. Older driver? cu124 and cu121 ship via the matching wheel indexes and as direct-download Linux binaries on the release page.
On AMD hardware
The default Vulkan build works on AMD cards, and stays the fallback if ROCm isn't set up. There's also a dedicated ROCm build that's faster. It bundles the ROCm userspace, so you need only the amdgpu kernel driver.
Command | |
Homebrew |
|
AUR |
|
Nix |
|
Flatpak |
|
Binary | |
pip (devs) |
|
uv (devs) |
|
Same lilbee command after install. Linux only. Cards: MI100, MI200, MI300, MI350, RDNA2, RDNA3, RDNA3.5 APUs and RDNA4. ROCm 7 ships no GEMM kernels for the MI50, so it needs the Vulkan build. Largest of the three builds, since the ROCm userspace and per-card kernels ship inside it.
Then check it runs and pick a model:
lilbee self-check # ~90 MB download; runs an inference + an embedding; "SELF-CHECK PASSED" on success
lilbee # launch the terminal app; pick your models from the catalog on first runThe usage guide covers the rest: TUI screens, slash commands, CLI, HTTP server, MCP, env vars, and config.toml. The settings reference lists every setting and which of those surfaces can change it.
On older CPUs (pre-AVX2)
Pre-2013 Intel or pre-Zen AMD CPUs lack AVX2, so the normal build crashes on launch. The lilbee-compat build runs on any x86-64 chip back to ~2008.
Command | |
Homebrew |
|
AUR |
|
Nix |
|
Scoop |
|
Flatpak |
|
Snap |
|
Binary |
|
Binary + GPU |
|
pip (devs) |
|
Use a bundled build here if you can. The compat index carries the patched lancedb only, so the pip row installs lilbee without an engine and every model call will fail until you point LILBEE_LLAMA_SERVER_PATH at a llama-server that runs on your CPU.
Same lilbee command after install. The crash is from lancedb's AVX2-compiled wheels; this build swaps in a lancedb fork that picks instructions at runtime. A 👍 or comment on the upstream lance PR helps it land.
Linux runtime requirements
The Linux x86_64 wheel and binary bundle the Vulkan loader, so they start on any distro. GPU detection still reads adapters through the system loader, though: without libvulkan1 lilbee treats the machine as CPU-only. Most desktop distros (Ubuntu 22.04+, Pop!_OS, Mint) ship it; on bare Arch / Fedora / Alpine images install it once: sudo pacman -S vulkan-icd-loader (Arch / Manjaro), sudo dnf install vulkan-loader (Fedora, RHEL), or sudo apt-get install libvulkan1 (Debian, Ubuntu).
Optional extras
These only matter for a pip or uv install: add the name in brackets, e.g. pip install --pre 'lilbee[engine,crawler,litellm]' (combine multiple, and --extra-index-url still works). The standalone binary and the Homebrew / AUR / Nix / Docker / Flatpak / Snap builds already include all four, which is why they need none of this. [engine] is the one that is not really optional; lilbee works fine without the other three.
Extra | What it adds |
| The bundled |
| Index websites alongside your files: crawl a docs site or wiki to markdown, then search it offline. |
| Bridge to hosted model providers for chat, vision, or embeddings while other roles stay local. The TUI flags when a hosted role is active. |
| Concept-graph search: extracts the ideas in your documents and uses how they relate to surface matches plain keyword search misses. No extra model calls. |
See the full guide on optional extras for configuration.
Developer install: pip and uv
For working on lilbee, or importing it as a library into an environment you
manage. Everything below needs the [engine] extra and its index; the bundled
builds above do not.
How | Command | Notes |
pip |
| Python 3.11 to 3.14. Runs on any x86_64 CPU with AVX2 (2013+; older CPUs: On older CPUs). Swap the index for your hardware, below. |
uv |
| Same wheels as pip; fetches a Python for you if you need one. |
From source |
| Needs |
The engine. llama-server runs every model, and it ships as the [engine]
extra rather than as part of lilbee. It is not on PyPI: the CUDA and ROCm
wheels run 444 MiB to 863 MiB each, several times
PyPI's default 100 MiB per-file limit,
so every backend is published from lilbee's own
PEP 503 package index at lilbee.sh. That
is what --extra-index-url is for, and the index you pick is the build you get:
cpu is compiled with every GPU backend off, metal publishes only a macOS
arm64 wheel, vulkan only Linux and Windows ones.
Hardware | Index | Command |
NVIDIA (CUDA) |
|
|
AMD (ROCm) |
|
|
Apple silicon |
|
|
Other GPUs |
|
|
No GPU |
|
|
Leave the extra off and lilbee still installs and starts. The first thing that needs a model then fails with an error naming the engine and repeating the command for your hardware, so it is recoverable rather than mysterious, but it is a step you have to take.
Hardware requirements
Standalone mode runs entirely on your machine. No cloud required. Minimum: Apple Silicon Mac, or a 64-bit Intel/AMD CPU from 2013+ (older CPUs: On older CPUs), or an ARMv8 Linux box; 8 GB RAM, 2 GB disk.
Platform | Minimum | Recommended |
macOS arm64 | Apple Silicon (M1 or newer), macOS 11+ | M-series Pro / Max / Ultra |
macOS x86_64 | Intel Mac with AVX (Ivy Bridge or newer), macOS 12+ | Quad-core Intel with 16+ GB RAM |
Linux x86_64 | 64-bit Intel/AMD from 2013+ ( | Modern Intel/AMD CPU + an NVIDIA, AMD, or Intel Arc GPU |
Windows x86_64 | 64-bit Intel/AMD from 2013+ ( | Modern desktop / workstation CPU + GPU |
Linux ARM64 | ARMv8 NEON-capable (Raspberry Pi 4+, AWS Graviton, Ampere Altra) | Modern ARM server with 16+ GB RAM |
Resource | Minimum | Recommended |
RAM | 8 GB | 16 to 32 GB to keep several local models warm at once (chat + embed + rerank + vision); actual footprint scales with the sizes and quantizations you pick |
GPU / Accelerator | none required (CPU-only works) | Apple Silicon (Metal) · NVIDIA / AMD / Intel Arc (Vulkan) · faster vendor builds with the runtime bundled: CUDA on NVIDIA, ROCm on AMD (see Install) |
Disk | 2 GB | 10+ GB for multiple models |
Quick start
Two recommended ways to use lilbee, depending on whether you're the one driving:
Run
lilbeefor the full-screen terminal app. On first run you pick a chat model straight from the catalog, fit-checked against your hardware, then you index files, search, and chat without leaving the TUI. The Settings screen exposes every retrieval knob (search depth, distance threshold, reranker, chunking) so you can tune lilbee to your library shape.Connect it to your agent over MCP. Any MCP-aware coding agent calls
lilbee_search/lilbee_addand gets back cited snippets it can quote. Agents can also fine-tune lilbee on the fly vialilbee_settings_set. Drop in the lilbee-mcp skill and the agent reads the full surface: every tool, every retrieval knob, and when to widen for prose vs narrow for code. See A reference for AI agents.
Retrieval defaults are sane, and every setting is tunable from env vars or config.toml, most of them from the TUI, MCP, and the HTTP API too; the settings reference has a column per surface. The CLI and HTTP API cover scripting and headless runs. See the usage guide.
Highlights
Private by default. The models, the index, and every question and answer stay on your machine. No telemetry, no account, no cloud calls unless you add a cloud model yourself.
Answers cite the source line. Click a citation, jump to the file at the exact line; when the answer isn't in your library, lilbee says so instead of inventing one.
It works, and the demos prove it. Every GIF and reel here is recorded live on real hardware, nothing staged, backed by 100% test coverage, full typing, and CI on macOS, Linux, and Windows.
One command to running. Install, run
lilbee, pick a model that fits your machine from the catalog, and you're chatting.Reads almost anything: 90+ formats and 150+ languages across documents, scanned pages, spreadsheets, ebooks, web pages, and source code.
Chunks that stand on their own. Prose and code are split differently so each piece keeps its meaning, which is where most of the retrieval quality lives.
A real search engine on top, ranking every result by how well it answers you, with 50+ tunable knobs and sane defaults.
It brings and runs the models itself, on Metal, Vulkan, or CUDA, with no server to point at and no cloud account. Browse Hugging Face, pull a model, give it a role (chat, embedding, vision, rerank).
A model too big for one card runs across all of them, sized with gguf-parser and tensor-split automatically, or pinned by hand. Run a model bigger than one card.
Already on Ollama or LM Studio? Keep them. lilbee's own manager covers the same architectures they run, and their models also show up in the same pickers.
One install, many surfaces: TUI, CLI, MCP server, REST API, and Python library, so your coding agent answers from your real files, with citations.
Everything in one file, nothing to operate. The binary bundles the whole stack (search engine, crawler, MCP + HTTP servers, TUI, Python, llama.cpp) in ~360-530 MB, or ~0.7-1.3 GB with CUDA; it loads on demand and nothing stays running.
Per-project libraries. One library for everything, or one per project.
Why lilbee
A small local model is fun, but limited on its own. Give it properly processed documents and a search engine over them, and it becomes genuinely powerful. Without those, it never gets past novelty.
lilbee does all of it in one install: it runs the models, processes your documents, crawls the web pages you point it at, and searches the lot with a real engine. The same engine works two ways:
An Encarta 99 over your own files. Build a library from your documents and saved web pages, then read it and ask questions of it in the terminal.
A reference layer for code. Point it at your project, dependencies, and API docs, and your coding agent answers from what's actually there, with file:line citations, instead of guessing function names.
The long-term goal: make local AI genuinely useful on hardware you already own, with no token budgets, no provider to depend on, and nothing about your files leaving your machine; the cloud's there only when you want it.
How lilbee compares
lilbee is built for consumer hardware and for people who don't want to babysit infrastructure. It isn't another model server you point an app at; it's a local search engine with the model runner built in. One install gives you the whole stack in a single executable:
A search engine over your files, with answers that cite the source line, not just a model to chat with.
A managed fleet, chat, embedding, vision, and reranking, spread across every GPU in the machine behind a load-balancing router, not one model loaded at a time.
Everything bundled: model manager, search engine, web crawler, MCP server for coding agents (native opencode and hermes), HTTP server, TUI, and Python, in one file.
It sits between two worlds: the desktop runners that get a model chatting on your machine (Ollama, LM Studio), and vLLM, the server you stand up to push one model to a cluster of users. lilbee runs models to do retrieval over your files, and scales that whole stack across every GPU in the machine, from one small file.
Full comparison table
lilbee | ||||
Primary focus | local search, chat, and serving across your GPUs | desktop app to run and chat with models | local model runner with a growing ecosystem | high-throughput GPU serving |
Runs local models | ✓ | ✓ | ✓ | ✓ |
Search your own files, with citations | ✓ full RAG pipeline, inline per-line citations | per-session doc attachment (RAG, document-level citation) | — | — |
Chat, embedding, vision, rerank as one managed fleet | chat, embed, vision (no rerank), loaded individually | chat, embed, vision (no rerank), loaded individually | each supported, but one model per server | |
Multi-GPU model placement | ✓ GPU selection + tensor parallelism (CUDA) | |||
Scales the whole stack, not just one model | ✓ per-GPU replicas + load-balancing router | — | — | one model per server |
Built for many-user throughput at scale | — | |||
Web crawler built in | ✓ built in | — | — | — |
Long-term memory (opt-in) | ✓ opt-in | — | — | — |
Interfaces | TUI, CLI, MCP, REST, Python, Obsidian GUI | desktop GUI, lms CLI, Python + TS SDKs, REST API, MCP client | ||
Use your existing Ollama / LM Studio / cloud as a backend | ✓ how | — | — | — |
Of the four, lilbee is the only one built around retrieval, and the only one that scales the whole stack, chat, embedding, vision, and reranking, across every GPU in the machine behind a load-balancing router.
Install size (single-file download, models excluded)
Download sizes in decimal GB/MB (bytes ÷ 1000), measured from each project's own release artifacts, linked. lilbee and Ollama measured 2026-07-25 from their release APIs (lilbee v0.6.90b420.dev726, Ollama v0.32.4).
macOS | Windows | Linux | What you get | |
lilbee (Metal / Vulkan, default) | 317 MB | 333 MB | 478 MB | the whole stack: search engine, crawler, servers, TUI, model runner, fleet manager |
lilbee (CUDA, opt-in for NVIDIA) | n/a | 666 MB | 1.25 GB | the same whole stack, with the faster CUDA runtime |
lilbee (ROCm, opt-in for AMD) | n/a | n/a | 854 MB* | the same whole stack, with the faster ROCm runtime |
181 MB | 1.56 GB (CUDA bundled) | 1.42 GB (CUDA bundled) | a model runner, fetches its runtimes separately | |
569 MB | 617 MB | 1.10 GB | a desktop app (Electron) | |
n/a | n/a | multi-GB | a Python + CUDA serving engine |
Even lilbee's CUDA build stays under Ollama's, and it's the whole stack, not just a model runner.
* ROCm is the one figure not yet from a release: it is the binary CI builds today, measured, and lands here unchanged at the first release that carries it.
Already on Ollama or LM Studio? lilbee runs on top of them. Prefer a GUI to the terminal? The Obsidian plugin maps lilbee's model manager and search to a visual interface inside your vault.
First start
The very first launch does one-time work: a bundled build unpacks itself behind a progress bar, and the model loads before your first answer, shown live inside the answer bubble. Every launch after that opens straight to chat in a couple of seconds.
Very first launch
Every launch after
Measured with a small chat model (Qwen3 0.6B):
Very first launch | Every launch after | |
Chat on screen | 15 to 20s, one-time unpack | 2 to 3s |
First answer of the session | 10 to 20s, the engine load plays in the bubble | the same, or instant with Keep engine warm inside the idle window |
Answers after that | model speed | model speed |
Bigger models load longer; the bubble shows real progress while the weights load. The usage guide explains the engine lifecycle and how to keep the engine warm so relaunches skip the load.
What you can do with it
A library of your own files
Point lilbee at a folder of PDFs, notes, ebooks, or code and it builds a searchable library, with citations that click back to the source line. The pattern works for anything you have a lot of text about: a shelf of appliance manuals, a field's research papers, a car's service manuals, your company's internal wiki. Whatever you give it becomes searchable, and you can talk to it.
https://github.com/user-attachments/assets/73903a5c-9c0a-42a8-9ffd-bdf34f719c29
Ask it something with a real answer at stake and you get the answer, not a paraphrase of the question. Here it reads the towing section out of a car manual and answers with the page it came from, so you can check it. The panel on the right is the GPU doing it, on this machine.
https://github.com/user-attachments/assets/284c316c-85f8-46d1-9531-59476f0db9f7
Offline copies of websites
Install the [crawler] extra, point lilbee at a docs site, a wiki, or a vendor's API reference, and the pages get fetched, converted to markdown, and added to your library. From then on you can search or chat with that copy of the site offline, even after it changes or goes down.
https://github.com/user-attachments/assets/8380c49b-cc65-43ae-83d4-ba9e3aa84af4
Or crawl a whole site, not just one page. With recursive crawling on, lilbee follows the links and indexes the lot; watch the page count climb in the Task Center, then ask one question that synthesizes across the whole site.
https://github.com/user-attachments/assets/0c7fbed2-9b40-4976-9856-1720c4f9ffb0
Documents, code, and scanned images
lilbee splits indexing by what's being read:
Prose and structured documents (PDFs, Office files, ebooks, HTML, 90+ formats) go through Xberg with heading-aware chunking, so each chunk keeps its section context.
Code goes through tree-sitter's AST-aware splitter across 150+ languages, so chunks map to functions, classes, and modules instead of arbitrary line ranges.
Scanned PDFs and photos go through OCR in 100+ languages: Tesseract for plain text (set
LILBEE_OCR_LANGUAGE, e.g.eng+deu), or a local / remote vision model that keeps tables and layout as markdown.
Retrieval returns things that make sense on their own, not fragments cut through an argument or a function signature.
Pick and tune your models
You install and switch chat, embedding, vision, and reranking models from inside the terminal: browse the catalog, pull a model, pick a role. Retrieval and generation expose 50+ settings (chunk size, search strictness, reranker depth, and more), editable from the TUI, env vars, or a project-local config file. Sane defaults.
Tested GPUs and backends
Placement reads what the engine reports about your hardware, and every backend words that differently, so lilbee checks each backend on real silicon rather than inferring it from the last one. CUDA from an RTX 3090 up to H200, and up to eight A100s at once, Vulkan on NVIDIA and Intel, ROCm on an AMD Instinct MI300X, Metal on Apple Silicon, and a CPU-only host. docs/tested-gpus.md lists every machine and what each run settled. Send captures from hardware the table does not list.
Supported models
lilbee's engine is llama.cpp, so lilbee runs what llama.cpp runs: any GGUF model built on one of the architectures below. The list comes from the bundled engine itself and grows with every engine update.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
One representative per family also runs the full pipeline end to end on real GPUs -- the models, method, and results are in docs/tested-models.md.
https://github.com/user-attachments/assets/993a63d4-9468-4a55-b9ed-e4b1ae1ed235
Already running Ollama or LM Studio? Keep them.
Watch it: Ollama as the model manager and LM Studio as the model manager. Point lilbee at a running manager, index a PDF on camera, and get a cited answer back.
lilbee works with Ollama and LM Studio. Finding and running models for you is the default and simplest path (lilbee pulls them and runs them on Metal / Vulkan / CUDA, no server to stand up), but you don't have to adopt a new model manager to use lilbee.
Point it at a running manager. Your models in Ollama or LM Studio show up in the same catalog and role pickers (chat, embedding, vision, rerank), labeled by where they run, alongside lilbee's own and any cloud models. Mix freely.
They stay read-only. lilbee lists and runs them but never pulls or deletes them, so their lifecycle stays in the app you already use.
On
pip/uv, this needs the[litellm]extra (pip install --pre 'lilbee[litellm]'); the Homebrew, AUR, Nix, Docker, Flatpak, and Snap builds already include it. See Install.
Both reels run chat and embedding on the other manager's models, picked out of the catalog's Library tab where each row names the server it runs on.
https://github.com/user-attachments/assets/52635a74-b69f-42df-b427-3c8f8499323f
https://github.com/user-attachments/assets/13ec8b12-f931-46ac-a500-8a7940d1a2bd
See when a model won't load before you download it
Hugging Face has thousands of GGUFs, but the bundled llama.cpp only supports a subset of architectures and brand-new ones take time to reach the pinned runtime. lilbee tags incompatible models in the catalog and refuses the download (with an override confirm), so you don't wait through a multi-GB pull only to hit "unsupported architecture" at load.
https://github.com/user-attachments/assets/b42effc3-a7f6-4391-904c-3ac897712172
Cloud models, when you want them
lilbee runs entirely on your machine by default. Two ways to use a cloud model when you want one:
Bring your own key. Install the
[litellm]extra, add an API key, then point any role (chat, embedding, vision, rerank) at a cloud model from the same catalog. The TUI shows a warning the whole time a cloud model is on.Pair lilbee with a cloud agent over MCP. Your files, the embeddings, and the index stay local. Any MCP-aware agent calls
lilbee_search/lilbee_addand gets back cited snippets.
Either way, your files and the index stay on your computer. Only what you ask and the snippets needed to answer it get sent to the cloud model.
Agents
lilbee serves your coding agents two ways, both local: it runs the models they talk to, and it answers their searches with cited snippets from your library.
Launch your coding agent on local models
lilbee launch opencode, lilbee launch hermes, and lilbee launch claude set up lilbee's local models in your agent in one command. For opencode and hermes, lilbee registers itself as a provider and an MCP server in the agent's own config and leaves your existing setup intact; for Claude Code, lilbee serves an Anthropic-compatible API and points the session at it by env, without touching Claude Code's settings. Each launch warms a model and opens the agent pointed at it. No API keys, no provider setup, and nothing leaves your machine. Tool-calling works across many GGUF families; docs/agent-models.md has the verified list and how the QA harness measures it.
One model serves as many agents as you want to run. These reels show four working at once against a single local model, each in its own worktree, reading and searching this repository through lilbee.
https://github.com/user-attachments/assets/5f3fd1a4-f946-4008-bfd8-600142785327
Qwen3 Coder Next, 45GB across three RTX 4090s: four agents on one model, 138 tokens a second warm.
https://github.com/user-attachments/assets/510a1691-4289-4d98-b749-7522c1f28559
Gemma 4 26B is a thinking model, and lilbee streams its reasoning as visible text: every pane shows the model working through the problem before it answers.
https://github.com/user-attachments/assets/06dbf829-1e1e-4a1f-9ca2-32aa65086f13
Qwen3.6 27B on the same four tasks: each agent states what it expects, then reads the code to check itself.
https://github.com/user-attachments/assets/46ce5440-ee9d-4420-a881-031a1ccccec8
And the same setup scales up: Devstral 2 123B, 70GB across two A100 80GB cards, one agent at the model's full 14 tokens a second.
It tunes itself, too. Tell a small local model to widen lilbee's search when a first result comes back thin, and the second pass returns full function bodies with file:line citations; a more capable model does the same from a prompt like "improve your search results." The lilbee-mcp skill teaches your own model the pattern.
https://github.com/user-attachments/assets/7bfec600-4c06-4a2f-8f77-be7e92f4f33f
A reference for AI agents
Once configured, lilbee plugs into whatever agent you use, over MCP. Feed it your project's docs, your dependency source, your API docs, your design notes; the agent stops making up function names and instead reads the actual code, cites file and line, and says it doesn't know when the answer isn't in your library. The lilbee-mcp skill is the single entry point: drop it into .opencode/skills/ or .claude/skills/ and it documents every tool, the workflows the agent should follow, and points to drop-in AGENTS.md and worker-subagent starters under examples/agent-integration/. This works with cloud-model agents too; lilbee stays local, and only the queries and the returned chunks reach the model.
Your files, the search index, and the embeddings stay on your computer. The agent calls lilbee_search and gets back cited snippets with file and line. The agent reels above show this live: each pane reads and searches this repository through lilbee.
Run a model bigger than one card
When a chat model won't fit on a single GPU, lilbee spreads it across the ones you have. It sizes each role's memory with gguf-parser, keeps headroom on every card, and tensor-splits the chat model across the fewest GPUs that fit, with the embedder, reranker, and vision models placed alongside it behind a load-balancing router. This is automatic: ask a question and the model loads split across your cards, answering from your own indexed source. Here a 70B is spread across three consumer cards and answers a mechanic's question from an indexed car manual, citing the page it came from.
https://github.com/user-attachments/assets/2a2232e6-d8ce-4302-92e4-6467f4fb1bee
You can also place it by hand. The placement editor pins each role to the cards you choose, previews the fit before anything loads, and applies it live. Ask for a layout that can't fit and it tells you the exact shortfall instead of failing at load time.
TUI
lilbee (no args) launches a full Textual terminal app: streaming chat with clickable citations, a model bar with searchable pickers and a Search/Chat toggle, a Task Center for background jobs, and screens for the model catalog, settings, and the generated wiki. Type / for the command list; tab completion works everywhere.
https://github.com/user-attachments/assets/ab4c5847-2261-421d-91a0-e3838498901c
Ctrl+P opens the Textual command palette, ? on an empty prompt (or F1 anywhere) toggles the keybinding cheat sheet, /help opens the slash-command catalog. Every action lilbee can take is reachable from one of those three.
https://github.com/user-attachments/assets/7c4f1096-44a4-40b5-b511-0f6496c520c5
Conversations are kept. Reopen an earlier one and it comes back with its history and citations intact.
https://github.com/user-attachments/assets/3ee7fb50-b983-4761-807c-2f024bbc3756
Tell it something about yourself and it remembers, across conversations rather than only within one.
https://github.com/user-attachments/assets/08a69c31-d74f-4e0a-97b6-340dc195848c
Every setting is editable in the app, and the first run opens the model catalog to get you started.
https://github.com/user-attachments/assets/a578dfd1-61a5-4008-b9bf-e94539003b6e
https://github.com/user-attachments/assets/702975d8-5c1f-4fa7-92a6-bf594ef9d2e3
Every reel on this page (plus the extras that don't fit here) is at lilbee.sh/tutorial with long-form captions. Tape sources are in demos-src/ on the gh-pages branch. For commands and settings, see the usage guide.
HTTP Server
The HTTP server exposes a REST API any tool or GUI can hit: search (with SSE streaming), document lifecycle, crawling, model management, configuration. See the REST API reference and the usage guide for setup.
The Obsidian plugin is a GUI built on it: it starts the HTTP server in the background, and every citation opens a Source Preview scrolled to the exact spot. It is an official Obsidian community plugin: install it from Settings then Community plugins inside Obsidian. The plugin README has setup.
Running as a service (optional)
For tools that talk to lilbee's HTTP REST API (the Obsidian plugin, custom GUIs, anything hitting /api/*), your OS launcher can keep the HTTP server warm so requests skip the cold-start.
This is the only lilbee surface that benefits from a daemon. The TUI, lilbee chat, the MCP server, and the rest of the CLI load on demand and exit when you close them. No always-on process to babysit.
Pull a chat and embedding model first; all recipes pin the server to 127.0.0.1:42697.
Platform | Command |
macOS (Homebrew) |
|
Linux (Arch / AUR) |
|
NixOS | Import |
Supported formats
Document extraction powered by Xberg, code chunking by tree-sitter. lilbee handles every format Xberg can extract (100+) and tracks its list directly, so support grows as Xberg adds formats. The table below covers the common ones.
lilbee ingests 126 file extensions through Xberg and 306 programming languages through tree-sitter.
Format | Extensions | Requires |
| none; scanned pages need Tesseract or a vision model | |
Office |
| none |
eBook |
| none |
Images (OCR) |
| Tesseract or a vision model |
Notebooks |
| none |
Bibliographies |
| none |
| none | |
Data |
| none |
Text and markup |
| none |
Archives |
| none |
Code |
| none |
See the usage guide for OCR setup.
Wiki
lilbee reads the documents you've indexed and writes a wiki about them: one page per concept or entity, not per document. A subject that recurs earns its own page, written and cited from the source that mentions it most and cross-linked with [[wiki link]], with coverage across sources coming from synthesis pages. Every section is citation-verified against the source text before it publishes; lower-confidence pages wait in a drafts/ queue for review.
Pages are written on demand: open one that does not exist yet and lilbee writes it from the sources it has, then links it into the rest.
https://github.com/user-attachments/assets/3ba1478e-86b0-4a90-aba1-99384b4f92fb
See the usage guide for commands and configuration, and how the wiki is validated for the evidence behind it.
Other projects generate wiki-style pages too; they differ in what they read, where they run, and what happens between generation and publication.
Capability | lilbee wiki | |||
Builds a wiki from your own private documents (PDFs, notes) | ✓ | partial¹ | ✓ | — (code repos)² |
Runs fully local, no cloud account required | ✓ | ✓ | ✓³ | ✓ (Ollama) |
Every generated claim carries a citation with a quoted excerpt | ✓⁴ | — | — | —⁵ |
Citations mechanically verified against the source text before publishing | ✓ | — | — | — |
Quality gate (faithfulness score) that quarantines failing pages | ✓ | — | — | — |
Human review queue for gated pages: diff, accept, reject | ✓ | — | — | — |
Detects stale citations when a source document changes | ✓ | — | —⁶ | — |
Archives pages when their sources are deleted | ✓ | — | — | — |
Drift protection: a rewrite above threshold never silently replaces a reviewed page | ✓ | — | — | — |
Wiki pages feed back into search alongside your documents | ✓ | — | ✓ | — |
Never generates without an explicit action (auto-update strictly opt-in) | ✓ | n/a | n/a | n/a |
Multi-perspective research and outline planning before writing | — | ✓ | — | partial⁷ |
Entity relationship graph with hierarchical topic communities | partial⁸ | — | ✓ | — |
Researches topics on the live web while writing | — | ✓ | — | — |
Web UI (self-hosted) | — | ✓ (demo) | — | ✓ |
¹ STORM's retrievers are web search engines; its VectorRM grounds on a custom corpus, but documents must be pre-converted to CSV and indexed into Qdrant. No PDF or note ingestion in the repo.
² A local folder of .md/.txt files works via repo_type=local, but there is no PDF support and the prompts assume a codebase.
³ Any OpenAI-compatible local endpoint works; the config validator requires a placeholder api_key value.
⁴ Claims are cited with quoted excerpts or explicitly marked [*inference*]; lint flags any unmarked claim.
⁵ The page prompt instructs per-claim file:line citations, but nothing verifies them and no excerpt is quoted.
⁶ Incremental indexing exists, but old community reports are kept verbatim; nothing flags a stale page.
⁷ An LLM structure-planning step produces the page outline before writing; no multi-perspective research.
⁸ lilbee's optional [graph] extra builds a concept co-occurrence graph (PMI-weighted) with flat Leiden communities, usable as the wiki synthesis clusterer; no typed entity relations or hierarchical communities.
Built on
lilbee stands on a stack of established open-source projects, all bundled into one install:
Xberg parses 90+ document formats with heading-aware chunking.
llama.cpp is the local model runtime: lilbee bundles its
llama-serverand starts it for you, so every chat, embedding, vision, and reranker call goes through it. llama-swap keeps a server per role resident together behind one endpoint, and gguf-parser estimates each model's memory footprint so lilbee loads what fits. Without llama.cpp there is no lilbee.Hugging Face Hub (via huggingface_hub) hosts the model catalog and handles every download. Search, browse, and pull all route through it.
LanceDB is the embedded vector store.
tree-sitter (via tree-sitter-language-pack) chunks code across 150+ languages.
crawl4ai and Playwright crawl the web; Tesseract is the OCR fallback when no vision model is set.
LiteLLM bridges cloud model providers (the
[litellm]optional extra).MCP Python SDK is the agent surface; Typer is the CLI; Pydantic is the config + validation backbone.
Nuitka compiles the whole thing into the standalone single-file binary, bundling its own Python runtime so there is nothing to install and nothing to compile.
FAQ
Does my data leave my machine? No. Your files stay on disk and search runs locally. A cloud model is used only when you pick one.
Will a model fit my GPU? lilbee reads the GGUF file and your devices and estimates fit before you download, and splits large models across multiple GPUs. More at lilbee.sh/gpu.
Can my coding agent use it? Yes, over MCP. The agent reads your real code and docs before answering, cited to the file and line. More at lilbee.sh/mcp.
Support
Having trouble? See TROUBLESHOOTING.md for log locations and common failures.
lilbee is built and maintained by one person. If it is useful to you, you can chip in via PayPal. Bug reports and pull requests help just as much.
License
MIT. See LICENSE.
Available Tools
29 toolsaddA
Add files, directories, or URLs to the knowledge base, then sync.
Paths are absolute and resolve on the machine running lilbee, which is not
the caller's machine when the server is remote. URLs are fetched as single
pages; use crawl for sites.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| paths | Yes | ||
| enable_ocr | No | ||
| ocr_timeout | No | ||
| render_mode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It does disclose a key behavioral trait: URLs are fetched as single pages, not crawled, and paths are absolute and resolve on the server's machine. It also mentions the sync requirement. However, it doesn't disclose side effects (e.g., whether existing files are overwritten) or what happens with OCR or render mode settings, and it doesn't mention error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: the first states purpose and sync requirement, the second explains path resolution, and the third clarifies URL behavior vs crawl. Every sentence adds critical information with zero filler. It is front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters and an output schema exists, the description covers the most important operational context (path resolution, URL behavior, sync requirement). The gaps are explanation of parameters like 'force' and OCR options, but those are less critical to basic invocation. The presence of an output schema likely explains return values, so the description doesn't need to. A 4 is justified because it handles the trickiest contexts well, though it could mention what the return value indicates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The description partially does by implying that 'paths' is the main argument, and it clarifies how URLs are handled (single pages). However, it doesn't explain the semantics of 'force', 'enable_ocr', 'ocr_timeout', or 'render_mode' beyond what the schema minimally hints (e.g., 'render_mode' enum text). A 3 seems right because it adds some meaning for 'paths' and 'render_mode' indirectly but leaves key parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('add') and resource ('files, directories, or URLs to the knowledge base'), and clarifies the follow-up action ('then sync'). It also distinguishes itself from the sibling tool 'crawl' by noting that URLs are fetched as single pages, which clearly separates its role from crawl's site-wide crawling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool (when adding files, directories, or single URLs) and notes an important environment constraint (paths resolve on the lilbee machine, not the caller's when remote). It also provides an explicit exclusion: use 'crawl' for sites. However, it does not detail when to prefer alternative tools like 'import_dataset' or 'sync'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_browseB
Browse the model catalog. task: chat/embedding/vision/rerank.
size: small/medium/large/huge, by parameter count.
max_fit: fits/tight/wont_run, worst fit to keep.
sort: featured/downloads/name/size_asc/size_desc.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| sort | No | ||
| task | No | ||
| limit | No | ||
| offset | No | ||
| search | No | ||
| max_fit | No | ||
| featured | No | ||
| installed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains the meaning of enum-like values (e.g., max_fit: fits/tight/wont_run) but does not disclose pagination behavior, default sort, whether 'featured' and 'installed' are filters or flags, or what the response contains. The output schema exists but the description itself adds little behavioral context beyond value semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the main purpose in the first sentence, then uses a terse key: value format for parameter semantics. It is efficient, though the formatting is slightly telegraphic and could be clearer with a short sentence about how filters combine.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter browse tool with no annotations and 0% schema coverage, the description covers the core filter dimensions but leaves limit, offset, search, featured, and installed unexplained. The output schema exists, so return values are partially covered, but an agent would still be guessing about pagination and filter semantics. This is a minimally viable description with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add meaning for four parameters (task, size, max_fit, sort) by listing allowed values, which is genuinely useful. However, five parameters (limit, offset, search, featured, installed) are left entirely undocumented, and the description does not explain how the parameters combine, so the compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource ('Browse the model catalog') and enumerates the key filter dimensions (task, size, max_fit, sort), which distinguishes it from sibling tools like model_list and model_show. However, it does not explicitly contrast itself with those siblings, so it loses a point for not naming the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing the filter dimensions and their allowed values, giving an agent a sense of how to narrow a catalog browse. It does not state when to prefer this over model_list or model_show, nor does it mention any exclusions or prerequisites, so the guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_placementA
Clear the manual placement and return to automatic placement.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It only states the basic action without mentioning side effects, reversibility, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, minimal sentence that conveys the core purpose without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no parameters and an output schema, the description is mostly complete but lacks context on prerequisites or result details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so baseline score of 4 applies; no additional parameter description needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (clear) and the resource (manual placement), and distinguishes it from siblings like preview_placement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like add or remove, nor any prerequisites or contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawlA
Start a non-blocking crawl; poll via crawl_status(task_id).
depth=0 (default) = single URL, N = follow links N levels,
null = whole site. render_mode: "http"/"browser".
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| depth | No | ||
| max_pages | No | ||
| render_mode | No | ||
| include_subdomains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does disclose the non-blocking nature, the depth semantics (0, N, null), and render_mode options. However, it omits behavior for max_pages and include_subdomains, and does not mention side effects, resource implications, or how the task_id is returned beyond implying it exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact lines with no filler. The main action and polling workflow are front-loaded, followed by parameter semantics. Every sentence adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core workflow and two of five parameters, and an output schema exists so return values need not be described. But for a no-annotation tool with 5 parameters, omitting max_pages and include_subdomains leaves the agent without enough context to use the full tool correctly, and the null-depth note is inconsistent with the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for depth (0 default, N levels, null whole site) and restates render_mode options. But url, max_pages, and include_subdomains are left unexplained, and the 'null' depth value conflicts with the schema's integer type, creating ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Start a non-blocking crawl.' It also distinguishes itself from the sibling crawl_status by directing the agent to poll via crawl_status(task_id), and from crawl_cancel implicitly by describing the start workflow. The depth and render_mode semantics further clarify what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: use this tool to initiate an asynchronous crawl, then poll with crawl_status. It does not explicitly state when to prefer crawl over search or sync, but it names the companion polling tool and implies the start-then-poll workflow, which is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawl_cancelA
Stop a running crawl started by crawl. Pages already saved are kept.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It reveals that pages already saved are kept, which is useful. But it does not mention other behaviors like whether the cancel is immediate, error handling, or permission requirements, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with zero waste. Every word earns its place, clearly stating the action and a key behavioral consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple cancel operation, the description covers the main purpose and the key side effect (saved pages kept). An output schema exists, so return values need not be explained. Minor missing details about edge cases (e.g., task not found or already finished) are acceptable given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required parameter, task_id, with no description. The tool description does not explain what task_id is or where to obtain it (e.g., from a crawl call). With 0% schema description coverage, the description should compensate, but it doesn't.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Stop a running crawl') on a specific resource ('crawl started by ``crawl``'), which distinguishes it from sibling tools like crawl and crawl_status. The verb and resource are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use (for crawls started by `crawl` that are still running) and provides a clear context. However, it does not explicitly mention alternatives or when not to use, such as checking status first with crawl_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawl_statusB
Poll a crawl task by id; returns {status, pages, error}.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the return fields but omits behavioral traits like idempotency, rate limits, or error handling. Adequate for a simple status poll, but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with inline code formatting. No wasted words; efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter and existence of an output schema, the description covers the basics. However, it could mention it is meant to be used after a crawl to poll progress, enhancing context completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It mentions polling 'by id' and the parameter is named 'task_id', making the mapping clear. No additional syntax or constraints provided, but sufficient for a single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it polls a crawl task by id and returns status, pages, and error, distinguishing it from sibling tools like 'crawl' for initiating tasks. However, the verb 'poll' could be more explicit about checking status after initiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., 'crawl' for starting a task, 'search' for searching). It is implied for checking status after a crawl, but lacks explicit when-not or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_datasetA
Write the per-page {source, page, text} dataset to a file (no vectors).
fmt is parquet/jsonl (empty infers from the suffix); source limits to one file.
| Name | Required | Description | Default |
|---|---|---|---|
| fmt | No | ||
| output | Yes | ||
| source | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes core behavior (write to file, no vectors) but does not disclose side effects (e.g., read-only, no modification of original data). No annotations provided, so description carries burden but only partially addresses it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-loaded with main purpose and parameters. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main purpose and two parameter details, but lacks usage context and behavioral safety. Output schema exists (not shown) so return values not needed. With no annotations, description is adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Explains fmt (parquet/jsonl, infers from suffix) and source (limits to one file) but does not describe output parameter beyond being the file path. Schema coverage is 0%, so description adds some value but leaves gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool writes a per-page dataset to a file, specifies no vectors, and implies export action. Distinguishes from import_dataset (sibling) by nature of operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use for exporting dataset to file in parquet/jsonl optionally limited to one source. No explicit when-to-use or alternative guidance, but context suggests it's for file output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gpusA
List detected GPUs with free/total VRAM (the placement HTTP /api/gpus equivalent).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the burden. It clearly indicates a read-only operation listing GPUs with memory info. No destructive or side effects are suggested, and the behavior is transparent for such a simple tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys all necessary information without extraneous words. It is perfectly sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema present, the description fully covers the tool's purpose and behavior. It explains what is listed and provides an equivalent API reference, leaving no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so schema coverage is 100%. The description adds meaningful context about the return values (free/total VRAM) beyond the schema, justifying a baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists detected GPUs with free/total VRAM, and provides the equivalent HTTP endpoint. This distinguishes it from sibling tools which are unrelated to GPU listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for checking GPU availability, but does not explicitly state when to use it versus alternatives or any prerequisites. However, due to its simplicity (no parameters), usage is largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_placementA
Show the current effective multi-GPU model placement.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It correctly implies a read-only operation without side effects. It does not specify edge cases but is adequate for a simple getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, succinct sentence that front-loads the key action and resource. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with no parameters and an output schema, the description provides all necessary context: it returns the current effective placement. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so schema coverage is 100%. The description adds no parameter-specific value, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Show the current effective multi-GPU model placement.' It uses a specific verb ('Show') and resource ('multi-GPU model placement'), and distinguishes itself from siblings like set_placement and clear_placement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit when/when-not guidance is given, the tool's purpose is straightforward and the name implies its usage relative to siblings (set, clear, preview). Context is clear enough for an agent to infer when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_datasetA
Import a per-page text dataset, re-embedding under the current model.
Replaces existing copies; imported sources are detached so sync won't delete them.
| Name | Required | Description | Default |
|---|---|---|---|
| fmt | No | ||
| dataset | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: replaces existing copies and detaches imported sources from sync. However, it lacks details on authorization, rate limits, or potential side effects on other data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no fluff. The first sentence states the primary purpose, and the second adds essential behavioral context. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the tool's moderate complexity, the description covers the main action, replacement, and detachment. It lacks details on re-embedding process and prerequisites but is generally sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It partially explains the 'dataset' parameter (the dataset to import) but does not mention the 'fmt' parameter at all, leaving its purpose unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool imports a per-page text dataset and re-embeds it under the current model. It distinguishes the tool from siblings like export_dataset by specifying the action and additional behavior of replacing copies and detaching sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., crawl, add). The description does not specify prerequisites or preferred contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
initA
Initialize a local .lilbee/ knowledge base; empty path = cwd.
Switches the MCP session to use it for subsequent calls.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the initialization and session switching behavior, but does not address idempotency, error cases, or effects if the knowledge base already exists. No annotations are provided to supplement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two clear sentences, no redundancy, and the key behavior is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose but lacks details on prerequisites, error cases, and integration with other tools. The presence of an output schema may compensate for return values, but overall completeness is limited.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds the default behavior for an empty path beyond the schema's simple string type, but does not detail valid paths, error conditions, or other constraints. Given 0% schema coverage, more parameter detail would improve.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool initializes a local .lilbee/ knowledge base and switches the session, with default to cwd. This specific verb+resource distinguishes it from sibling tools like search or sync.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used before other calls to set the session knowledge base, but lacks explicit when-not-to-use guidance or comparisons with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsA
List all indexed documents with their chunk counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Indicates a read-only list operation, but does not disclose potential issues like large result sets, pagination, or any side effects; lacks depth given no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no waste; direct and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless tool with an output schema, the description is sufficient to understand its purpose and output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so the description adequately covers the schema; no additional value needed beyond the trivial schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all indexed documents and includes chunk counts, distinguishing it from siblings like search or add.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., search, status) or any prerequisites; lacks explicit context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
model_listB
List installed models. source is native / remote; task filters by role.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | ||
| source | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It explains filter parameters but does not disclose results format, pagination, performance, or any side effects. Minimal behavioral context beyond basic functionality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with clear front-loading. Every word adds value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is simple and output schema exists, so description is mostly complete. Provides necessary filter context. Could benefit from brief note on result limitation or ordering, but adequate for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It defines 'source' as native/remote and 'task' as filter by role, adding meaning but remaining somewhat vague (e.g., 'role' not defined). Partial compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states 'List installed models' with clear verb and resource. Distinguishes from sibling tools like 'search' or 'sync' by focusing on listing installed models with filtering options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description implies listing usage but does not mention exclusions or compare with siblings like 'search' or 'crawl'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
model_pullA
Download a model and stream progress.
source is native (GGUF) or remote (SDK).
allow_unsupported overrides the supported-architecture refusal.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| source | No | ||
| allow_unsupported | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It mentions streaming progress and parameter effects but omits important details like auth requirements, side effects, or error handling. For a download tool, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two lines with no redundant information. The first sentence states the core purpose, followed by precise parameter explanations. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a download tool with streaming and no annotations, the description covers basic usage and parameter meanings. However, it lacks details on return format (though output schema exists), error scenarios, or concurrency/rate limits. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by explaining source as 'native (GGUF) or remote (SDK)' and allow_unsupported as 'overrides the supported-architecture refusal.' Model parameter is not elaborated, but overall it adds significant meaning beyond the schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Download a model and stream progress,' which is a specific verb-resource pair. It distinguishes from siblings like model_list and model_show by focusing on downloading rather than listing or inspecting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool over alternatives such as model_show or search. The description only explains parameter details but lacks context like prerequisites or use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
model_rmA
Remove an installed model. Only native GGUF models lilbee downloaded; Ollama/LM Studio are read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| source | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the destructive nature (remove) and the limitation to certain sources, but lacks details on whether removal is irreversible, permissions needed, or any confirmation steps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is very concise at two sentences, front-loading the purpose. It earns its keep by covering scope and limitations, but could be slightly more structured for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of the tool (removal with two params) and presence of output schema, the description covers the core action and constraints. However, it lacks parameter descriptions, which is a notable gap for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage and the description adds no explanation for the 'model' and 'source' parameters. The description does not clarify what values are expected or how 'source' affects behavior, leaving a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Remove an installed model' with a specific verb and resource. It distinguishes from siblings by specifying it only works on native GGUF models from 'lilbee' (likely a typo for 'libbee' or similar), and notes that Ollama/LM Studio models are read-only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use (removing models) and an exclusion (Ollama/LM Studio models are read-only). However, it does not mention alternatives for removing other model types or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
model_showC
Show catalog and installed metadata for a model ref.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only says 'Show catalog and installed metadata' without disclosing side effects, permission needs, rate limits, or what exactly 'catalog and installed metadata' entails. The minimal description leaves the agent guessing about behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is concise and to the point. While it lacks detail, it is not overly verbose. Every word contributes to stating the tool's basic function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity (1 parameter, output schema exists), the description is minimally adequate. It explains the basic purpose but omits details about return values, parameter semantics, and how it differs from similar tools. The output schema reduces some burden, but more context would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter 'model' has no description in the input schema (0% coverage). The description does not clarify acceptable values, format (e.g., name, ID, path), or constraints. No additional meaning is provided beyond the schema's type string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses verb 'Show' and resource 'catalog and installed metadata for a model ref,' clearly indicating the tool's function. It is specific enough to distinguish from siblings like 'model_list' (which lists models) and 'model_pull' (which downloads). However, it does not explicitly differentiate from similar inspection tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'model_list' or 'search.' No exclusions or prerequisites mentioned. The description simply states the action without contextual hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_placementB
Preview what a placement spec (or auto, when omitted) would place. No changes made.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. States 'No changes made' which signals non-destructive preview. Does not disclose permissions, rate limits, or error behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, direct sentences. No unnecessary words. Could be slightly more informative without harming conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple preview tool with one optional parameter and output schema. However, lacks explanation of the output or any error conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must add meaning. Only says 'placement spec (or auto, when omitted)', which clarifies that the object represents a placement spec but provides no structure or constraints for the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'preview' and resource 'placement spec'. Indicates non-mutating behavior ('No changes made'). Lacks explicit differentiation from siblings like 'clear_placement' but distinct enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies safe preview usage via 'No changes made', but no explicit guidance on when to use vs alternatives like 'add' or 'clear_placement'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
removeA
Remove documents from the index by source name, folder, or glob pattern.
Source files are never deleted. A folder name removes every document indexed
beneath it; a glob (*/?/[]) removes every matching source.
| Name | Required | Description | Default |
|---|---|---|---|
| names | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It explicitly states that source files are never deleted and explains matching behavior for folders and globs. This covers key behavioral traits, though rate limits or reversibility are not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, no wasted words. The first sentence clearly states purpose, and the second adds critical behavioral context. It is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter and the existence of an output schema, the description covers input semantics and key behavioral notes. It lacks any mention of return values, but the output schema likely provides that. Minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the 'names' parameter, but the description thoroughly explains that names can be source names, folder names, or glob patterns, with specific semantics for each. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Remove' and resource 'documents from the index' are clear. It specifies the input types (source name, folder, glob pattern) and distinguishes from sibling tools like 'add' and 'sync'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (to remove indexed documents) but does not explicitly state when not to use it or mention alternative tools. No clear guidance on prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resetA
Factory reset: delete all documents and indexed data. Requires confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses destructive behavior (delete all documents and indexed data) and the confirm requirement. But lacks details on reversibility or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no fluff. Every part provides essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple destructive tool with one parameter, the description covers the core function and key requirement. Does not mention output, but completeness is reasonable given output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (confirm) with 0% schema coverage. Description compensates by stating it requires confirm=true, adding meaning beyond the boolean type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Factory reset: delete all documents and indexed data', using a specific verb and resource. It implicitly distinguishes from sibling tools like 'settings_reset' by indicating a full reset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the requirement 'Requires confirm=true', which is a usage constraint. However, it does not provide guidance on when to use this tool versus alternatives like 'settings_reset' or 'remove'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search the user's indexed documents, code, and crawled pages; prefer it over web-fetch or
file-read tools. Returns chunks with citations. scope: "both" (default) / "raw" / "wiki". No wiki layer here: use scope "raw" or "both".
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| scope | No | ||
| top_k | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return format (chunks with citations) and scope semantics. No annotations provided, so description carries full burden; lacks details on top_k range or rate limits, but adds useful context beyond schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a scope note; no fluff. Front-loaded purpose and guidelines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, scope, and output format. Lacks top_k default/range and any mention of permissions, but given output schema exists, it's sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% coverage, so description compensates by explaining scope values and default. Query is assumed, top_k is not explained but is self-explanatory. Still, partial coverage justifies 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches indexed documents, code, and crawled pages, distinguishing it from web-fetch or file-read tools. It specifies the verb and resources, with a clear preference note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends this tool over web-fetch or file-read, and clarifies scope usage with default values and wiki limitation. Missing when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_placementA
Set and apply a manual multi-GPU placement spec (persists to config).
The spec maps a role ("chat"/"embed"/"rerank"/"vision") to a placement, e.g.
{"chat": {"devices": [0, 1], "tensor_split": [1, 1]}}. devices is the
GPU indices (get_gpus lists them); tensor_split is optional per-device
weights (omit for an even split). Omit a role to leave it auto-placed.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the operation persists to config (indicating state change) and details the spec structure. It does not mention permissions, side effects on other placements, or error handling, but the core behavioral traits are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, stating the purpose in the first sentence. It includes a compact example and additional details in a few sentences without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to explain return values. It covers the spec format, optional fields, and the persistence behavior. Minor gaps include lack of validation rules or error scenarios, but overall it provides sufficient context for a single-parameter set operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only an object type with no inner structure, resulting in 0% coverage. The description fully compensates by specifying the expected format: a mapping from role to an object containing devices array and optional tensor_split array, with a concrete JSON example. This adds essential meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Set and apply'), the resource ('manual multi-GPU placement spec'), and the key behavioral trait ('persists to config'). It effectively distinguishes this tool from its siblings like get_placement, preview_placement, and clear_placement by focusing on setting/applying rather than retrieving or clearing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear example of the expected format and explains how to specify roles and devices, including the optional tensor_split. It mentions that omitting a role leaves it auto-placed. However, it does not explicitly state when this tool should be avoided (e.g., use preview_placement for dry-run) or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_getB
Get a single setting's current value + metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It only states the tool gets a value and metadata, but fails to mention side effects, auth requirements, rate limits, or behavior when the key does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise at one sentence, front-loading the core purpose. However, it sacrifices valuable detail that could be included without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not detailed here), the description does not need to elaborate on return values. However, with only one parameter and no parameter description, along with missing usage guidelines and behavioral context, the description falls short of being fully complete for an agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage for the 'key' parameter, the description adds no additional meaning beyond the parameter name. It does not explain what constitutes a valid key, how to obtain it, or any format constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get', the resource 'a single setting', and the output 'current value + metadata'. This distinctly separates it from sibling tools like settings_list (list multiple) and settings_reset (reset).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, such as when to use settings_get over settings_list or other tools. There are no context signals or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_listA
List writable lilbee settings (each with value, default, type, help, choices).
group filters by group name (case-insensitive); empty returns all.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the output fields (value, default, type, help, choices) and parameter behavior. Despite no annotations, it gives sufficient transparency for safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two succinct lines, front-loaded with the main purpose, and each word adds value. No redundancy or waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single optional parameter, list operation), the description covers output structure and parameter behavior. No missing critical details like authentication or pagination, which are likely not needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'group' has zero coverage in schema but the description adds full semantics: filtering behavior, case-insensitivity, and default when empty. This compensates well for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and the resource ('writable lilbee settings'), with specific details about output fields. The name and description distinguish it from siblings like settings_get and settings_reset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the optional group parameter's behavior (case-insensitive filter, empty returns all), providing clear context for when to use it. While it doesn't explicitly contrast with sibling tools, the purpose is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_resetC
Reset writable settings to their built-in defaults.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions 'writable settings' implying read-only settings cannot be reset, but it fails to clarify that only specified keys are reset (contradicted by the required 'keys' parameter which suggests per-key operation). No annotations exist, so the description must carry all behavioral info but is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, which is efficient. However, it lacks additional structure (e.g., bullet points) that could improve readability, but given the simplicity, it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the number of sibling tools and no annotations, the description should provide more context about scope (e.g., does it reset all writable settings or only specified ones?), but it does not. The existence of an output schema partially mitigates the need to describe return values, but overall the description is incomplete for a complex tool ecosystem.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description does not mention the 'keys' parameter at all, leaving its purpose and format entirely undocumented. The tool's behavior is implied as resetting settings, but how to specify which settings is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reset') and resource ('writable settings') with the outcome ('built-in defaults'). It clearly distinguishes from sibling tools like settings_list (read) and settings_get (read single), as reset is a mutation action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. For example, it does not explain when a reset is appropriate compared to updating individual settings via other tools, nor does it mention any prerequisites or side effects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_setA
Atomically update writable settings; rolls back on validation error.
Persists to config.toml; returns {updated, reindex_required}.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses atomicity, rollback on validation error, persistence to config.toml, and the return format. It does not mention authentication requirements or what happens on success beyond the return, but overall provides good behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with key information (atomic update, rollback, persistence, return value). No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (implied by has_output_schema: true), the description omits critical details about the 'updates' parameter structure, which is essential for correct invocation. The tool's complexity (atomicity, validation) demands more parameter documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has a single required parameter 'updates' of type object, but the description adds no detail about its expected structure (keys, value types, required fields). Schema description coverage is 0%, so the agent has no guidance on how to construct the updates object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('atomically update writable settings'), the persistence target ('config.toml'), and the return value. It distinguishes from sibling tools like settings_get, settings_list, and settings_reset by focusing on atomic updates with rollback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied ('update writable settings') but no explicit guidance on when to use this tool over alternatives like settings_reset or when not to use it. No prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusA
Show indexed documents, configuration, and chunk counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. 'Show' implies read-only, but doesn't explicitly state non-destructiveness, permissions needed, or side effects. Adequate for a simple status tool but lacks explicit behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 6 words, front-loading the action and scope. No wasted words; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and presence of an output schema, the description sufficiently conveys what the tool does. Could mention it is read-only, but the word 'Show' implies that. Competently covers the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so schema coverage is 100%. Baseline for 0 parameters is 4. Description adds no param info, which is appropriate given no parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Show') and clearly lists the resources ('indexed documents, configuration, and chunk counts'). It distinguishes itself from sibling tools like 'search' or 'sync' by indicating it provides a summary view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., 'search' for querying, 'list_documents' for document listing). No prerequisites, exclusions, or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
syncA
Sync the documents directory into the vector store.
force_rebuild drops every table and re-ingests. retry_skipped
clears failed-file skip markers without dropping the store.
prune_ignored drops sources a .lilbeeignore now excludes; without it,
the patterns only govern what sync takes in.
| Name | Required | Description | Default |
|---|---|---|---|
| force_rebuild | No | ||
| prune_ignored | No | ||
| retry_skipped | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing side effects. It does so explicitly for each flag: force_rebuild 'drops every table', retry_skipped 'clears failed-file skip markers', and prune_ignored 'drops sources' without dropping the store. It also notes the default behavior of prune_ignored. This provides meaningful behavioral safety information that is absent from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused paragraph that front-loads the primary action and then explains each flag using backticks for clarity. It is concise without being overly terse, and every sentence contributes to describing behavior. The only minor inefficiency is the lack of a visual break between purpose and parameter details, but it remains well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description appropriately focuses on the tool's purpose and parameter effects. It covers all three parameters and their edge cases but does not mention default behavior when no flags are passed, potential side effects on existing data beyond force_rebuild, or concurrency/asynchronous behavior. These are likely captured in the output schema, so the description is largely complete for the agent's needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is the sole source of parameter meaning. It explains all three boolean parameters in detail with concrete effects and consequences. This fully compensates for the schema's lack of descriptions, giving the agent clear guidance on what each flag does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Sync the documents directory into the vector store.' This clearly states the tool's core function. While it doesn't explicitly name sibling alternatives, the phrasing is distinct enough (e.g., vs. 'add' or 'crawl') to avoid confusion, though an explicit differentiation would warrant a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the three boolean flags do but does not provide any context on when to use this tool versus siblings like 'init', 'add', or 'crawl'. There is no mention of typical use cases, prerequisites, or conditions that would make 'sync' the appropriate choice over others. This leaves the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_statusA
Show wiki layer status: page counts, recent lint issues.
Registered even when the wiki is disabled, like the HTTP status route, so a caller can read the disabled state instead of finding no tool at all.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses an important trait: it is registered even when the wiki is disabled, similar to an HTTP status route. This gives context about availability and what the tool can reveal, which is sufficient for a status check tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the main purpose front-loaded clearly in the first sentence. The second sentence adds a meaningful caveat about disabled state without unnecessary elaboration. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain return values. It covers the essential purpose and the notable behavior about disabled state. It could mention what the response looks like, but for a simple status tool this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so schema coverage is trivially 100%. The description correctly omits parameter details. Baseline for a zero-parameter tool is 4, and no additional explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Show wiki layer status' with specific contents (page counts, recent lint issues). It distinguishes itself from sibling tools like 'status' by focusing on the wiki layer, and the name reinforces this specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains a key usage context: even when the wiki is disabled, this tool remains registered so callers can read the disabled state. This implies using this tool when you need wiki status regardless of enabled state, but it does not explicitly compare to alternatives like 'status'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_wipeA
Delete every generated wiki page and its indexed rows. Pass confirm=true.
Registered even with the wiki disabled, because turning the setting off leaves the pages generated earlier in place.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool deletes all generated wiki pages and their indexed rows, and that it requires confirmation (confirm=true). It also explains its availability even when the wiki is disabled, which is valuable behavioral context. With no annotations, this description carries the full burden and does a good job conveying the destructive and conditional nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the action and requirement, the second provides rationale for the tool's availability. Every sentence adds value and it is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple destructive tool with one parameter, the description covers the action, the confirmation requirement, and a specific use case (even when wiki disabled). It doesn't explain return values or permissions, but an output schema is present, so that's not required. The description is complete enough for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines a boolean 'confirm' with no description, but the description explicitly instructs to 'Pass confirm=true,' clarifying the parameter's role and required value. This adds meaning beyond the schema, though it could further explain the behavior when confirm is false.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete every generated wiki page and its indexed rows.' This is a specific verb (delete), resource (wiki pages and indexed rows), and scope (every). It distinguishes the tool from siblings like 'remove' or 'reset' by focusing on generated wiki pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the tool is 'Registered even with the wiki disabled, because turning the setting off leaves the pages generated earlier in place,' providing clear context for when to use it. It also instructs to 'Pass confirm=true,' indicating the required action. However, it doesn't explicitly mention when not to use it or name alternative tools.
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 tool update
v1.0.8- Changed
catalog_browse1 field changed- added
Input schema / properties / max_fitAdded value: +{ + "type": "string" +}
1 tool update
v1.0.5- Changed
sync1 field changed- added
Input schema / properties / prune_ignoredAdded value: +{ + "type": "boolean" +}
3 tool updates
v1.0.4- Added
crawl_cancel - Added
wiki_status - Added
wiki_wipe
9 tool updates
v1.0.3- Added
catalog_browse - Added
get_placement - Added
list_documents - Added
model_rm - Changed
remove1 field changed- removed
Input schema / properties / delete_filesRemoved value: -{ - "type": "boolean" -}
- Added
reset - Added
set_placement - Added
settings_set - Added
status
24 tool updates
v1.0.2- Changed
add15 fields changed- removed
Input schema / properties / enable_ocr / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / enable_ocr / defaultRemoved value: -null - removed
Input schema / properties / enable_ocr / titleRemoved value: -"Enable Ocr" - added
Input schema / properties / enable_ocr / typeAdded value: +"boolean" - removed
Input schema / properties / force / defaultRemoved value: -false - removed
Input schema / properties / force / titleRemoved value: -"Force" - removed
Input schema / properties / ocr_timeout / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - removed
Input schema / properties / ocr_timeout / defaultRemoved value: -null - removed
Input schema / properties / ocr_timeout / titleRemoved value: -"Ocr Timeout" - added
Input schema / properties / ocr_timeout / typeAdded value: +"number" - removed
Input schema / properties / paths / titleRemoved value: -"Paths" - added
Input schema / properties / render_mode / $refAdded value: +"#/$defs/CrawlRenderMode" - removed
Input schema / properties / render_mode / anyOfRemoved value: -[ - { - "$ref": "#/$defs/CrawlRenderMode" - }, - { - "type": "null" - } -] - removed
Input schema / properties / render_mode / defaultRemoved value: -null - removed
Input schema / titleRemoved value: -"addArguments"
- Removed
catalog_browse - Added
clear_placement - Changed
crawl14 fields changed- removed
Input schema / properties / depth / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / depth / defaultRemoved value: -null - removed
Input schema / properties / depth / titleRemoved value: -"Depth" - added
Input schema / properties / depth / typeAdded value: +"integer" - added
Input schema / properties / include_subdomainsAdded value: +{ + "type": "boolean" +} - removed
Input schema / properties / max_pages / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / max_pages / defaultRemoved value: -null - removed
Input schema / properties / max_pages / titleRemoved value: -"Max Pages" - added
Input schema / properties / max_pages / typeAdded value: +"integer" - added
Input schema / properties / render_mode / $refAdded value: +"#/$defs/CrawlRenderMode" - removed
Input schema / properties / render_mode / anyOfRemoved value: -[ - { - "$ref": "#/$defs/CrawlRenderMode" - }, - { - "type": "null" - } -] - removed
Input schema / properties / render_mode / defaultRemoved value: -null - removed
Input schema / properties / url / titleRemoved value: -"Url" - removed
Input schema / titleRemoved value: -"crawlArguments"
- Changed
crawl_status2 fields changed- removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"crawl_statusArguments"
- Changed
export_dataset6 fields changed- removed
Input schema / properties / fmt / defaultRemoved value: -"" - removed
Input schema / properties / fmt / titleRemoved value: -"Fmt" - removed
Input schema / properties / output / titleRemoved value: -"Output" - removed
Input schema / properties / source / defaultRemoved value: -"" - removed
Input schema / properties / source / titleRemoved value: -"Source" - removed
Input schema / titleRemoved value: -"export_datasetArguments"
- Added
get_gpus - Changed
import_dataset4 fields changed- removed
Input schema / properties / dataset / titleRemoved value: -"Dataset" - removed
Input schema / properties / fmt / defaultRemoved value: -"" - removed
Input schema / properties / fmt / titleRemoved value: -"Fmt" - removed
Input schema / titleRemoved value: -"import_datasetArguments"
- Changed
init3 fields changed- removed
Input schema / properties / path / defaultRemoved value: -"" - removed
Input schema / properties / path / titleRemoved value: -"Path" - removed
Input schema / titleRemoved value: -"initArguments"
- Removed
list_documents - Changed
model_list5 fields changed- removed
Input schema / properties / source / defaultRemoved value: -"" - removed
Input schema / properties / source / titleRemoved value: -"Source" - removed
Input schema / properties / task / defaultRemoved value: -"" - removed
Input schema / properties / task / titleRemoved value: -"Task" - removed
Input schema / titleRemoved value: -"model_listArguments"
- Changed
model_pull6 fields changed- removed
Input schema / properties / allow_unsupported / defaultRemoved value: -false - removed
Input schema / properties / allow_unsupported / titleRemoved value: -"Allow Unsupported" - removed
Input schema / properties / model / titleRemoved value: -"Model" - removed
Input schema / properties / source / defaultRemoved value: -"native" - removed
Input schema / properties / source / titleRemoved value: -"Source" - removed
Input schema / titleRemoved value: -"model_pullArguments"
- Removed
model_rm - Changed
model_show2 fields changed- removed
Input schema / properties / model / titleRemoved value: -"Model" - removed
Input schema / titleRemoved value: -"model_showArguments"
- Added
preview_placement - Changed
remove4 fields changed- removed
Input schema / properties / delete_files / defaultRemoved value: -false - removed
Input schema / properties / delete_files / titleRemoved value: -"Delete Files" - removed
Input schema / properties / names / titleRemoved value: -"Names" - removed
Input schema / titleRemoved value: -"removeArguments"
- Removed
reset - Changed
search8 fields changed- removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / scope / defaultRemoved value: -"both" - removed
Input schema / properties / scope / titleRemoved value: -"Scope" - removed
Input schema / properties / top_k / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / top_k / defaultRemoved value: -null - removed
Input schema / properties / top_k / titleRemoved value: -"Top K" - added
Input schema / properties / top_k / typeAdded value: +"integer" - removed
Input schema / titleRemoved value: -"searchArguments"
- Changed
settings_get2 fields changed- removed
Input schema / properties / key / titleRemoved value: -"Key" - removed
Input schema / titleRemoved value: -"settings_getArguments"
- Changed
settings_list3 fields changed- removed
Input schema / properties / group / defaultRemoved value: -"" - removed
Input schema / properties / group / titleRemoved value: -"Group" - removed
Input schema / titleRemoved value: -"settings_listArguments"
- Changed
settings_reset2 fields changed- removed
Input schema / properties / keys / titleRemoved value: -"Keys" - removed
Input schema / titleRemoved value: -"settings_resetArguments"
- Removed
settings_set - Removed
status - Changed
sync5 fields changed- removed
Input schema / properties / force_rebuild / defaultRemoved value: -false - removed
Input schema / properties / force_rebuild / titleRemoved value: -"Force Rebuild" - removed
Input schema / properties / retry_skipped / defaultRemoved value: -false - removed
Input schema / properties / retry_skipped / titleRemoved value: -"Retry Skipped" - removed
Input schema / titleRemoved value: -"syncArguments"
2 tool updates
v1.0.1- Changed
add2 fields changed- added
Input schema / $defsAdded value: +{ + "CrawlRenderMode": { + "description": "How a crawl fetches pages. ``http`` uses no browser; ``browser`` runs Chromium with JS.", + "enum": [ + "http", + "browser" + ], + "title": "CrawlRenderMode", + "type": "string" + } +} - added
Input schema / properties / render_modeAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/CrawlRenderMode" + }, + { + "type": "null" + } + ], + "default": null +}
- Changed
crawl2 fields changed- added
Input schema / $defsAdded value: +{ + "CrawlRenderMode": { + "description": "How a crawl fetches pages. ``http`` uses no browser; ``browser`` runs Chromium with JS.", + "enum": [ + "http", + "browser" + ], + "title": "CrawlRenderMode", + "type": "string" + } +} - added
Input schema / properties / render_modeAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/CrawlRenderMode" + }, + { + "type": "null" + } + ], + "default": null +}
21 tool updates
v1.0.0- First observed
add - First observed
catalog_browse - First observed
crawl - First observed
crawl_status - First observed
export_dataset - First observed
import_dataset - First observed
init - First observed
list_documents - First observed
model_list - First observed
model_pull - First observed
model_rm - First observed
model_show - First observed
remove - First observed
reset - First observed
search - First observed
settings_get - First observed
settings_list - First observed
settings_reset - First observed
settings_set - First observed
status - First observed
sync
TDQS
Scored across 29 tools
Most tools are distinct, but several overlap semantically: status/wiki_status/crawl_status all report state, reset/wiki_wipe/settings_reset/clear_placement all delete or reset something, and catalog_browse/model_show both touch the model catalog. Descriptions help, but generic names like reset, add, sync, and status increase the chance an agent picks the wrong one.
The set mostly follows snake_case verb_noun naming, e.g. list_documents, set_placement, model_pull. However, verb placement is inconsistent (get_gpus vs settings_get, model_rm vs model_pull) and several single-word tools (reset, sync, add, init, crawl) break the pattern. Still, the overall style is predictable and readable.
29 tools exceeds the 25-tool threshold and feels heavy even though the server covers multiple subdomains (indexing, crawling, wiki, models, settings, GPU placement). Several tools could be consolidated, such as the various status/get commands. The breadth is real, but the count is still too high for easy agent navigation.
The tool surface covers the main lifecycles well: document add/sync/remove/list/export/import/search, crawl start/status/cancel, model list/show/pull/remove, settings CRUD, and placement get/preview/set/clear. The wiki layer is thin with only status and wipe, and there is no explicit wiki generation or document update tool, but these are minor gaps rather than blocking dead ends.
Maintenance
Related MCP Connectors
Self-hosted AI-native knowledge workspace with hybrid search, GraphRAG, and MCP.
Run AI customer support from your terminal: conversations, knowledge base, and chat widget.
150+ vertical AI expert bots as agent tools. $1 bots run on YOUR machine - your data stays yours.
Self-hostable shared brain for you and your AI agents — docs, flows, meetings, decisions, rationale
Related MCP Servers
- AlicenseAqualityAmaintenanceLocal RAG system for Claude Code with hybrid search (semantic + BM25), cross-encoder reranking, markdown-aware chunking, and 12 MCP tools. Zero external servers, pure ONNX in-process.13268MIT
- AlicenseNot gradedqualityDmaintenanceLocal AI generation for images, audio, speech, and 3D models using open source models.3GPL 3.0
- AlicenseAqualityDmaintenanceA local-first document retrieval MCP server that enables AI coding tools like Codex to search private local documents via semantic search and keyword boost, supporting ingestion of PDF, DOCX, TXT, Markdown, and HTML files.7MIT
- FlicenseAqualityDmaintenanceEnables indexing local documents (PDF, Markdown, text, code) into a knowledge base and querying them via semantic search using local embeddings, all running privately on your machine.4-