Skip to main content
Glama

Flaiwheel

flaiwheel MCP server Available on Glama

Self-hosted memory & governance layer for AI coding agents. Turn every bug fix into permanent knowledge. Zero cloud. Zero lock-in.

🚀 Why Flaiwheel Exists

AI coding agents forget everything between sessions. That leads to repeated bugs, lost architectural decisions, and knowledge decay.

Flaiwheel ensures:

  • Agents search before coding

  • Agents document after fixing

  • Commits automatically capture knowledge

  • Memory compounds over time

Every bug fixed makes the next bug cheaper.

Related MCP server: MCP VectorStore Server

🧠 How Flaiwheel Is Different

  • Persistent AI Memory That Compounds — knowledge doesn't reset between sessions.

  • Git-Native Automation — commits automatically become structured knowledge.

  • Governance, Not Just Storage — quality gates + enforced documentation.

  • Hybrid Search + Reranking — high-precision context for real codebases.

  • Fully Self-Hosted — single Docker container, no external infrastructure.

  • Zero Lock-In — all knowledge stored as structured flat files in Git.

✅ Who Flaiwheel Is For

  • Engineering teams using AI coding assistants in real projects

  • Codebases where repeated bugs are expensive

  • Teams requiring full data control

  • AI-native development environments

❌ Not For

  • Small hobby projects under a few thousand lines

  • Developers who just want better autocomplete

  • Pure SaaS workflows with no interest in self-hosting

🆚 Where Flaiwheel Fits

  • AI coding tools generate code.

  • RAG tools retrieve documents.

  • Flaiwheel governs and compounds structured engineering knowledge inside your own infrastructure.

It does not replace your AI assistant. It makes it reliable at scale.

📄 Whitepaper (PDF) — Vision, architecture, and design in depth.


⚙️ Key Technical Features

Flaiwheel is a self-contained Docker service that operates on three levels: Pull — agents search before they code (search_docs, get_file_context)
Push — agents document as they work (write_bugfix_summary, write_architecture_doc, …)
Capture — git commits auto-capture knowledge via a post-commit hook, even without an AI agent

  • Indexes your project documentation (.md, .pdf, .html, .docx, .rst, .txt, .json, .yaml, .csv) into a vector database

  • Provides an MCP server that AI agents (Cursor, Claude Code, VS Code Copilot) connect to

  • Hybrid search — combines semantic vector search with BM25 keyword search via Reciprocal Rank Fusion (RRF) for best-of-both-worlds retrieval

  • Cross-encoder reranker — optional reranking step that rescores candidates with a cross-encoder model for significantly higher precision on vocabulary-mismatch queries

  • Behavioral Directives — AI agents silently search Flaiwheel before every response, auto-document after every task, and reuse before recreating — all without being asked

  • get_file_context(filename) — pre-loads spatial knowledge for any file the agent is about to edit (complements get_recent_sessions for full temporal + spatial context)

  • post-commit git hook — captures every fix:, feat:, refactor:, perf:, docs: commit as a structured knowledge doc automatically

  • Living Architecture — AI agents are instructed to maintain self-updating Mermaid.js diagrams for system components and flows

  • Executable Test Flows — test scenarios are documented in machine-readable BDD/Gherkin format (Given, When, Then) for QA automation

  • Learns from bugfixes — agents write bugfix summaries that are instantly indexed

  • Structured write tools — 7 category-specific tools (bugfix, architecture, API, best-practice, setup, changelog, test case) that enforce quality at the source

  • Structured relations (v1)relations() and timeline() derive a per-project knowledge graph from optional YAML frontmatter on existing docs (id, replaces, depends_on, fixes, implements, status). No second store — markdown stays canonical and Git history is the validity window

  • Pre-commit validationvalidate_doc() checks freeform markdown before it enters the knowledge base, including unknown-relation-key warnings

  • Ingest quality gate — files with critical issues are automatically skipped during indexing (never deleted — you own your files)

  • Auto-syncs via Git — pulls AND pushes to a dedicated knowledge repo

  • Tool telemetry (persistent) — tracks every MCP call per project (searches, writes, misses, patterns), detects knowledge gaps, and nudges agents to document — persisted across restarts and visible in the Web UI

  • Impact metrics API/api/impact-metrics computes estimated time saved + regressions avoided; CI pipelines can post guardrail outcomes to /api/telemetry/ci-guardrail-report

  • Proactive quality checks — automatically validates knowledge base after every reindex

  • Knowledge Bootstrap — "This is the Way": analyse messy repos, classify files, detect duplicates, propose a cleanup plan, execute with user approval (never deletes files)

  • Cold-Start Codebase Analyzeranalyze_codebase(path) scans a source code directory entirely server-side (zero tokens, zero cloud). Uses Python's built-in ast module for Python, regex for TypeScript/JavaScript, the existing MiniLM embedding model for classification and duplicate detection. Returns a single bootstrap_report.md with language distribution, category map, top 20 files to document first ranked by documentability score, duplicate pairs, and coverage gaps. Reduces cold-start token cost by ~90% on legacy codebases.

  • Multi-project support — one container manages multiple knowledge repos with per-project isolation

  • Includes a Web UI for configuration, monitoring, and testing


What’s New in v3.13.0 — Observability

  • Flaiwheel now knows whether its knowledge repo is still connected to its remote. Everything before this reported on pushes that were attempted. The failure that hid 325 documents in a Docker volume for 2.5 months attempted nothing: the clone had drifted from its remote, so there was never anything to commit, so no push could fail, so nothing went red. check_divergence() compares HEAD against @{u} and classifies the result as synced / ahead / behind / diverged / no-upstream.

  • The "nothing to push" path is where this matters. That branch used to return an unconditional "already in sync". It now verifies the claim. Divergence is also checked after every successful push (did the commit actually land?), after a rejected push (a rejection is the classic symptom — now named instead of leaving you to read a git error), and on every pull.

  • A repo that indexes perfectly and pushes nothing is no longer "healthy". /health gains divergence_status, commits_ahead, commits_behind and last_divergence_at, and reports degraded on diverged, ahead or no-upstream. Being behind is the normal state between two pulls and deliberately does not alarm.

  • The agent is told directly. write_* results append an explicit warning when the repo has diverged — including on "nothing to push". A warning in an endpoint nobody polls does not exist; the agent that just wrote the document is the one that needs to know it never left the machine.

  • Tests: 316 → 335, against real temp repos including a force-pushed rewritten upstream — the real-world trigger, where a secret purge or a squash silently desynchronises every clone.

  • This closes the 2026-08-19 incident completely. The one item that looked outstanding — "watcher path scoping" — was retracted as a misdiagnosis after checking the running container. Its only evidence was the log line knowledge: update flaiwheel/telemetry.json, read as one project's file being committed into all 11 repos. The real path is .flaiwheel/telemetry.json, with a leading dot: the signature of the porcelain off-by-one already fixed in v3.12.2. Every project owns an identically-named telemetry file, so all 11 watchers logged the same mangled string at once — uniformity caused by shared code, mistaken for shared state.

Previous: v3.12.3

  • Every dependency is capped below the next major. Eleven requirements were unbounded >=X. That fails silently: the breaking release lands, existing installs keep working off a stale resolve, and it only bites on the next fresh install — CI, a Docker rebuild, a new contributor. Exactly how mcp 2.0.0 broke CI and the Docker build together three weeks after release while every dev machine stayed green. A clean install resolves to identical versions as before, so this constrains the future without moving anything today.

  • Sustained push failure now degrades /health. HealthTracker kept only last_push_ok — a single boolean the next attempt overwrites — so one blip and a repo failing for weeks looked the same. push_failures_consecutive escalates past 3 consecutive failures. A single failure deliberately does not degrade; crying wolf on transients is how alerts get ignored.

  • /health names the failing projects. Adds last_push_ok, last_push_error, push_failures_consecutive and degraded_projects — previously the endpoint could say degraded while showing only the default project's numbers, with no way to tell which repo was broken.

  • Pre-deploy image smoke test documented. An image can build cleanly and still fail every import at runtime. The README now verifies from flaiwheel.server import create_mcp_server inside the image before starting a container, and renames rather than removes the previous container so rollback is instant.

  • Tests: 308 → 316.

Previous: v3.12.2

  • Auto-commit no longer drops the first worktree-modified file. git status --porcelain emits XY <path> where a leading space is data (" M file"). Stripping the whole output before splitting ate that space on the first line only, so line[3:] truncated the filename's first character — .flaiwheel/telemetry.json became flaiwheel/telemetry.json, git add failed, and the commit aborted. Intermittent and file-order dependent, which is why it survived so long.

  • Renamed and copied files are staged correctly. Porcelain reports old -> new; the whole string was passed to git add, so renames were never committed.

Previous: v3.12.1

  • Pinned mcp[cli]<2.0.0. mcp 2.0.0 removed mcp.server.fastmcp (FastMCPmcp.server.mcpserver), breaking every import of the server on a fresh resolve.

Previous: v3.12.0

  • Auto-push now reports what actually happened. push_pending() returns a structured result (ok / noop / disabled / failed / blocked) and every write_* tool renders that outcome. Previously the success line was derived from configuration (git_auto_push and bool(git_repo_url)), so it read Auto-pushed to remote: True even when every push was being rejected. A failed push now says "Auto-push: FAILED — this doc is NOT on the remote" with the git error attached.

  • Push errors are no longer swallowed. The bare except in push_pending() that only wrote to the diagnostic log now records to HealthTracker and returns the error to the caller. A failing git commit is reported instead of raising through an unchecked check=True.

  • gitleaks runs inside the container, on the write path. Flaiwheel's commits are machine-generated and never human-reviewed, so secret scanning now happens in _push_local_changes() before the commit — not as a per-clone git hook that gets lost on re-clone. MCP_GITLEAKS_MODE=block (default) refuses to commit and reports the findings through the MCP result; warn commits and reports; off disables. Honours a .gitleaks.toml in the knowledge repo for allowlisting. A missing or broken scanner is reported explicitly, never silently skipped.

  • Tests: 300 → 308 (tests/test_watcher_push.py: push success/failure/noop/disabled reporting, gitleaks block/warn/clean, unavailable-scanner visibility).

Previous: v3.11.0

  • Telemetry now survives docker volume rm flaiwheel-data. A per-project summary slice is mirrored from the Docker volume into each knowledge repo at <docs_path>/.flaiwheel/telemetry.json. On the next cold start, hydrate_from_mirrors() rebuilds the in-memory state from these files so the Tool Telemetry dashboard does not reset to zero. Hot tier wins when both exist; mirror writes are rate-limited to 60s/project to avoid one Git commit per tool call. Events stay in the volume only (too noisy for the knowledge repo). Don't want it committed? Add .flaiwheel/ to your knowledge repo's .gitignore — Flaiwheel will still read/write the file locally.

  • Reset Telemetry button on every per-project tile in the Web UI. Zeroes summary counters across both storage tiers via the new POST /api/telemetry/reset?project=<name> endpoint. The 30-day impact-metrics window keeps working because events history is preserved.

  • Agent instructions taught the relations workflow. AGENTS.md and both install.sh templates now include a "Structured Relations Workflow" section with three concrete rules (when to add fixes, when to add replaces, when to add depends_on) so agents actually use the v3.10.x graph machinery instead of ignoring it.

  • Client Configuration's "VS Code" tab is now "VS Code + Copilot" with explicit help text pointing at GitHub Copilot agent mode. The .vscode/mcp.json file Flaiwheel emits already works for Copilot — no separate snippet needed.

  • Tests: 292 → 300 (8 new tests in test_telemetry.py for mirror writes, rate limiting, cold-start hydration, hot-tier authority, and reset semantics).

Previous: v3.10.1

  • Every structured writer now auto-emits frontmatter. write_bugfix_summary, write_architecture_doc, write_api_doc, write_best_practice, write_setup_doc, write_changelog_entry, and write_test_case prepend id / type / status: active + empty relation lists to every new doc. Every doc you create from now on is automatically a graph node — no manual frontmatter editing required. IDs are derived from the existing filename slugs (e.g. adr-2026-05-22-payment-service-architecture, bugfix-2026-05-22-fix-race-condition, api-create-user-endpoint).

  • New helper flaiwheel.frontmatter.emit() with stable, deterministic key order so same-day overwrites produce minimal diffs.

Previous: v3.10.0

  • Structured relations (v1) — two new read-only MCP tools, relations(entity_id) and timeline(entity_id), derive a per-project knowledge graph from YAML frontmatter on existing markdown docs. No new persistent store and no graph_add / invalidate writes: markdown stays the single source of truth and Git history is the validity window. Recognised relation keys: replaces, depends_on, fixes, implements. Scalar keys: id, type, status, superseded_at.

  • Frontmatter-aware quality checksvalidate_doc() now warns on unknown relation keys (info severity) and invalid status values (warning severity); heading-structure checks strip the leading --- block first so frontmatter does not confuse the "first heading is h1" rule.

  • GitWatcher.log_for_file() — read-only helper returning newest-first commits (hash, author, ISO date, subject); backs the timeline() tool.

  • Zero new dependencies — frontmatter parsing is stdlib-only (flaiwheel.frontmatter). No python-frontmatter / PyYAML added.

  • Total tools: 28 → 30.

Note: the SQLite ER store (graph_add / graph_invalidate / valid_from / valid_to columns) originally proposed for this feature is deferred as v2, gated on a real query becoming measurably too slow on v1. AST-driven code↔symbol edges (v3) remain merged with the feature_ideas_backlog #13 track.

Previous: v3.9.40

  • Installer: claude-md no longer fails on repeat runsclaude mcp add non-zero exits (e.g. MCP already registered) no longer abort the parallel phase under set -e; registration output is captured safely.

  • Installer: correct release version from GitHub_FW_VERSION is refreshed from main pyproject.toml when reachable so Docker rebuild / version checks stay aligned with the package even if raw install.sh on main lags at the CDN.

Previous: v3.9.29

  • Glama tool detection fixAuthManager crashed on read-only /data before the MCP server could start (the real reason Glama saw 0 tools). Skipped in stdio cold-start mode.

  • Zero print() on stdout — 36 remaining print() in watcher, indexer, readers, bootstrap replaced with diag() (stderr). Verified: full MCP handshake returns all 28 tools over stdio.

  • config.save() resilient — read-only filesystem logs warning instead of crashing.

Previous: v3.9.28

  • Glama / MCP stdio fix — all diagnostic output moved to stderr; stdout is now JSON-RPC only. Glama Inspector now detects all 28 tools correctly.

  • Improved cold-start detection — stdio cold-start logic handles empty Docker volumes correctly (no bootstrap / model download during Glama inspection).

Previous: v3.9.27

  • License cleanup — one LICENSE file (BSL 1.1) for correct GitHub/Glama detection; all docs and headers point to LICENSE (not LICENSE.md).

  • Glama / stdio inspection — optional [inspect] deps and cold-start stdio path for lightweight MCP directory builds.

Previous: v3.9.26

  • Claude Cowork skill — the Flaiwheel workflow is now distributed as a native Claude skill. The installer writes .skills/skills/flaiwheel/SKILL.md to your project. When you open the project in Claude (Cowork), the skill is auto-available — no extra setup needed. The skill drives session-start context restore, pre-coding knowledge search, mandatory post-bugfix documentation, and session-end summarisation.

  • Skill source also committed to skills/flaiwheel/SKILL.md in this repo for reference and manual install.

Previous: v3.9.25

  • WSL2 automatic pre-flight setup — WSL2 is now detected automatically and a dedicated pre-flight block runs before the main installer flow. No manual steps required:

    1. Switches iptables to legacy backend (fixes Docker networking / DNAT errors)

    2. Adds the current user to the docker group (no more permission denied)

    3. Starts the Docker daemon via service (no systemd on WSL2)

    4. Adds a Docker auto-start snippet to ~/.bashrc (idempotent, runs on every WSL2 login)

  • Scattered WSL2 checks throughout the script consolidated into the single pre-flight block.

Previous: v3.9.24

  • Fix: auto-install python3 if missing — the installer uses python3 extensively for JSON manipulation. On minimal Linux/WSL2 systems without python3, config file writes silently failed (/dev/fd/63: line N: python3: command not found). python3 is now checked as prerequisite #0 and auto-installed via apt/dnf/yum/pacman/brew if missing.

Previous: v3.9.23

  • Fix: Docker daemon start on WSL2 with iptables-legacy — Docker on WSL2 often fails to start silently because the default iptables-nft backend is not supported. The installer now switches to iptables-legacy via update-alternatives before starting Docker. Also adds the current user to the docker group automatically.

  • All install commands updated to bash <(curl ...) — every displayed install/re-run command throughout the script (error messages, AGENTS.md, Cursor rules, etc.) now uses process substitution to avoid WSL2 pipe issues.

Previous: v3.9.22

  • Fix: curl | bash pipe write failures on WSL2curl | bash can fail with curl: (23) Failure writing output on WSL2 due to pipe/tmp permission issues. The primary install command in README is now bash <(curl ...) (process substitution), which avoids the pipe entirely. The re-exec block also tries $HOME as a fallback temp dir when /tmp writes fail. Error message explicitly recommends the bash <(curl ...) form.

Previous: v3.9.21

  • Fix: sudo guard moved before re-exec block — when sudo curl | bash was used, the curl: (23) pipe error truncated the script before the previous sudo guard (which was after colors/functions) was ever reached. The guard is now the very first executable line (set -euo pipefail aside), so it fires even on a truncated download. Duplicate guard after colors removed.

Previous: v3.9.20

  • Fix: Docker daemon startup poll on WSL2 — instead of a fixed 5-second sleep, the installer now polls docker info every 2 seconds for up to 30 seconds after service docker start. Also shows the actual output of service docker start so startup errors are visible instead of silently swallowed.

Previous: v3.9.19

  • Fix: Docker daemon start on WSL2 — WSL2 typically has no systemd, so systemctl start docker silently failed. The installer now detects WSL2 via /proc/version and uses sudo service docker start instead. If Docker still isn't running after install, a clear WSL2-specific error is shown with the exact fix command and a tip to add it to ~/.bashrc for auto-start on login.

Previous: v3.9.18

  • Fix: block sudo curl | bash and sudo bash install.sh — running the installer as root via sudo breaks GitHub CLI authentication: gh auth stores credentials in /root/.config/gh/ instead of the real user's home, making every subsequent gh call fail. Also caused curl: (23) Failure writing output pipe errors on WSL. The installer now detects SUDO_USER at startup and exits immediately with a clear message telling the user to re-run without sudo. Privilege escalation for package installs is handled internally.

Previous: v3.9.17

  • Fix: gh auth login must not be run with sudo — after auto-installing gh on Linux/WSL, the installer now explicitly tells the user to run gh auth login without sudo. If auth was previously done with sudo, credentials ended up in /root/.config/gh/ and were invisible to the current user, causing the auth check to fail. The error messages at both the post-install and the auth-check step now clearly warn: do not use sudo for gh auth.

Previous: v3.9.16

  • Fix: installer works on WSL and non-root Linux — all Linux package manager commands (apt-get, dnf, yum, zypper, pacman), Docker convenience script, and systemctl calls now automatically use sudo when the installer is not running as root. Root installs are unaffected. Fixes Permission denied / lock file errors on WSL and standard Linux desktop users.

Previous: v3.9.15

  • Cold-start report cached in /data/analyze_codebase() saves the report to /data/coldstart-<project>.md after the first run. Subsequent calls return the cached report instantly (<1s). The installer also writes the cache during install so the very first MCP call by any agent is instant. Call with force=True to regenerate after major codebase changes.

  • analyze_codebase() in all agent Session Setup templatesAGENTS.md, .cursor/rules/flaiwheel.mdc, CLAUDE.md, and .github/copilot-instructions.md all now include it as step 3 of Session Setup. Agents automatically get the codebase overview before starting work.

  • Cold-start prompt asked before Docker rebuild — all interactive questions (embedding model + cold-start) are now batched upfront, then the rebuild runs unattended.

  • Fix: used docker exec for cold-start — replaced broken HTTP calls to the MCP SSE endpoint with direct docker exec python3. Analysis now works reliably in ~20s.

Previous: v3.9.14

  • Fix: fast-path always prompts for cold-start — no more silent skip when cached report exists.

Previous: v3.9.13

  • Improved cold-start classification — two-pass classifier: path heuristics first, code-specific embedding templates as fallback.

Previous: v3.9.12

  • Fix: y/n answer respected before cache check — explicit y now always re-runs analysis even when cached report exists.

Previous: v3.9.11

  • Fix: coldstart functions in global scope — moved _run_coldstart/_do_coldstart_analysis to top of script so fast-path can call them.

Previous: v3.9.10

  • Fix: version checkLATEST_VERSION now uses _FW_VERSION directly, no CDN fetch.

Previous: v3.9.9

  • Fix: cold-start on all paths_run_coldstart() called from fast-path, update, and fresh install. Smart cache detection.

Previous: v3.9.8

  • Cold-start report cachinganalyze_codebase() cached to /data/coldstart-<project>.md for instant reads. New force=True param.

Previous: v3.9.7

  • Agent Session Setup — all instruction templates now include analyze_codebase() as a first-session step.

Previous: v3.9.6

  • Fix: use docker exec — replaced broken HTTP calls to MCP SSE endpoint with direct docker exec python3 invocation. Cold-start report now actually works (~20s).

Previous: v3.9.5

  • Fix: warm up embedding model — added model warm-up before cold-start analysis (superseded by v3.9.6).

Previous: v3.9.4

  • Fix: cold-start retries while model loads — installer now retries analyze_codebase() for up to 90s after container starts.

Previous: v3.9.3

  • Fix: update detection always checks mainLATEST_VERSION now fetched from main branch so stale cached installers no longer silently skip updates.

Previous: v3.9.2

  • Cold-start prompt moved before Docker rebuild — all interactive questions now batched upfront.

Previous: v3.9.1

  • Cold-start prompt moved upfront — the install.sh cold-start question is now asked right after the embedding model selection (before the Docker rebuild), so all interactive questions are gathered first and the user never misses the prompt after a long rebuild.

Previous: v3.9.0

  • analyze_codebase(path) — new 28th MCP tool for zero-token cold-start analysis of legacy codebases. Runs entirely server-side in Docker. Uses Python ast, regex, MiniLM embeddings, and nearest-centroid classification. Returns a ranked bootstrap_report.md with language distribution, category map, top 20 files by documentability score, near-duplicate pairs, and recommended next steps. Reduces cold-start token cost by ∼90%.

Previous: v3.8.3

  • No auto-index on project add — adding a project via the web UI no longer immediately pulls and embeds the knowledge repo. Indexing is now deferred until explicitly triggered (“Git Pull + Reindex” or reindex() MCP tool), keeping the vector DB clean until the repo has been reviewed.

Previous: v3.6.x

  • VS Code / GitHub Copilot support — installer writes .vscode/mcp.json and .github/copilot-instructions.md.

  • Claude Desktop support — installer auto-configures Claude Desktop via mcp-remote.

  • Web UI Client Configuration panel — VS Code and Claude Code CLI tabs added.

Previous: v3.5.x

  • Claude Desktop + Claude Code CLI support added.

  • README strategically rewritten with positioning, target audience, and competitive framing.

Previous: v3.4.x

  • Search miss rate fix — search_bugfixes calls no longer inflate miss rate above 100%.

  • Classification consistency — _path_category_hint unified token-based approach across all categories.

  • CHANGELOG.md added to repo root.


Prerequisites: GitHub CLI authenticated (gh auth login), Docker running.

Platform support: macOS and Linux work out of the box. On Windows, run the installer from WSL or Git Bash (Docker Desktop must be running with WSL 2 backend enabled).

Run this from inside your project directory:

bash <(curl -sSL https://raw.githubusercontent.com/dl4rce/flaiwheel/main/scripts/install.sh)

WSL2 / Linux note: Use the bash <(curl ...) form above — it avoids curl: (23) pipe write errors that occur with curl | bash on some WSL2 setups. Never prefix with sudo.

That's it. The installer automatically:

  1. Detects your project name and GitHub org from the git remote

  2. Creates a private <project>-knowledge repo with the standard folder structure

  3. Starts the Flaiwheel Docker container pointed at that repo

  4. Configures Cursor — writes .cursor/mcp.json and .cursor/rules/flaiwheel.mdc

  5. Configures VS Code / GitHub Copilot — writes .vscode/mcp.json (native SSE, VS Code 1.99+) and .github/copilot-instructions.md

  6. Configures Claude Desktop (macOS app) — writes claude_desktop_config.json via mcp-remote bridge (requires Node.js)

  7. Configures Claude Code CLI — writes .mcp.json + CLAUDE.md and runs claude mcp add automatically if the CLI is on PATH

  8. Installs Claude Cowork skill — writes .skills/skills/flaiwheel/SKILL.md so the full Flaiwheel workflow is available as a native Claude skill

  9. Writes AGENTS.md for all other agents

  10. If existing .md docs are found, creates a migration guide — the AI will offer to organize them into the knowledge repo

After install:

Agent

What to do

Cursor

Restart Cursor → Settings → MCP → enable flaiwheel toggle

Claude Desktop (macOS app)

Quit and reopen Claude for Mac — hammer icon appears when connected

Claude Code CLI

Already registered automatically — run /mcp inside Claude Code to verify

VS Code

Open project → Command Palette → MCP: List Servers → start flaiwheel

Claude (Cowork)

Skill auto-loads from .skills/skills/flaiwheel/SKILL.md — no further action needed

The installer also sets up a post-commit git hook that automatically captures every fix:, feat:, refactor:, perf:, and docs: commit as a structured knowledge doc — no agent or manual action required.

Once connected, the AI has access to all Flaiwheel tools. If you have existing docs, tell the AI: "migrate docs".


Optional: Open Terminal Local Daemon (Open WebUI)

If you also use Open WebUI's Open Terminal integration, this repo includes helper installers for a local open-terminal daemon.

Third-party write-ups (for example AI·Collab — Open Terminal) may mirror only the Linux script; macOS uses scripts/macos/install-open-terminal-launchagent.sh below. After any mirror update, re-check the file with shasum -a 256 against the same revision on GitHub.

One-liner install via curl (no git clone)

Use main or pin a commit SHA / tag in the URL for reproducible bytes.

Linux / WSL2 (systemd --user):

curl -fsSL -o install-open-terminal-systemd-user.sh \
  https://raw.githubusercontent.com/dl4rce/flaiwheel/main/scripts/install-open-terminal-systemd-user.sh
/bin/chmod +x install-open-terminal-systemd-user.sh
/bin/bash ./install-open-terminal-systemd-user.sh

macOS (LaunchAgent; do not use sudo):

curl -fsSL -o install-open-terminal-launchagent.sh \
  https://raw.githubusercontent.com/dl4rce/flaiwheel/main/scripts/macos/install-open-terminal-launchagent.sh
/bin/chmod +x install-open-terminal-launchagent.sh
/bin/bash ./install-open-terminal-launchagent.sh

If chmod or bash are “not found”, your PATH is broken (often Conda base); the /bin/… paths above still work.

Linux / WSL2 (systemd --user)

./scripts/install-open-terminal-systemd-user.sh
  • Service name: com.flaiwheel.open-terminal-local.service

  • Default endpoint: http://localhost:8000

  • The script auto-generates an API key and prints it after install/reset.

  • On WSL2, make sure systemd=true is enabled in /etc/wsl.conf.

Useful commands:

systemctl --user status com.flaiwheel.open-terminal-local.service
journalctl --user -u com.flaiwheel.open-terminal-local.service -f

macOS (launchctl LaunchAgent)

./scripts/macos/install-open-terminal-launchagent.sh
  • LaunchAgent label: com.flaiwheel.open-terminal-local

  • Default endpoint: http://localhost:8000

  • The script auto-generates an API key and prints it after install/reset.

  • The LaunchAgent sets WorkingDirectory to $HOME by default so Open Terminal does not start in /private/tmp.

  • PATH: launchd does not load ~/.zshrc, so the daemon used to see only /usr/bin:/bin:… and miss Homebrew / Supabase CLI. The generated wrapper prepends /opt/homebrew/bin, /usr/local/bin, ~/.local/bin, and ~/.npm-global/bin. Re-run the installer (menu →1 Update) after pulling this change so the wrapper is regenerated.

  • Persisted custom folder: the installer can save a path in ~/.config/flaiwheel/open-terminal-working-directory (fresh-install prompt, or menu →5 when re-running the script). Update (menu →1) keeps using that saved path. One-off override: set OPEN_TERMINAL_WORKING_DIRECTORY for that run only.

Environment overrides (both scripts):

HOST=127.0.0.1 PORT=8000 OPEN_TERMINAL_CORS_ALLOWED_ORIGINS='https://your-openwebui.example' ./scripts/install-open-terminal-systemd-user.sh
HOST=127.0.0.1 PORT=8000 OPEN_TERMINAL_CORS_ALLOWED_ORIGINS='https://your-openwebui.example' ./scripts/macos/install-open-terminal-launchagent.sh

macOS only — custom initial folder for Open Terminal (must exist before you save it):

OPEN_TERMINAL_WORKING_DIRECTORY="$HOME/projects/my-repo" ./scripts/macos/install-open-terminal-launchagent.sh

Re-run the same script and choose 5 to change or clear the saved folder (or edit ~/.config/flaiwheel/open-terminal-working-directory). Non-interactive install: set the env var above or create that file with a single line (path); use AUTO_INSTALL_DEPS=1 to skip the first-run path prompt.


Updating

Run the same install command again from your project directory:

bash <(curl -sSL https://raw.githubusercontent.com/dl4rce/flaiwheel/main/scripts/install.sh)

The installer detects the existing container, asks for confirmation, then:

  • Rebuilds the Docker image with the latest code

  • Recreates the container (preserves your data volume + config)

  • Refreshes all agent configs and guides

Your knowledge base, index, and credentials are preserved — only the code is updated.


Manual Setup

1. Create a knowledge repo

# On GitHub, create: <your-project>-knowledge (private repo)
mkdir -p architecture api bugfix-log best-practices setup changelog
echo "# Project Knowledge Base" > README.md
git add -A && git commit -m "init" && git push

2. Build and start Flaiwheel

git clone https://github.com/dl4rce/flaiwheel.git /tmp/flaiwheel-build
docker build -t flaiwheel:latest /tmp/flaiwheel-build

# Smoke-test the image BEFORE starting or replacing a container.
# A broken transitive dependency only surfaces on a fresh resolve, so an
# image can build cleanly and still fail every import at runtime.
docker run --rm --entrypoint sh flaiwheel:latest -c \
  'python -c "from flaiwheel.server import create_mcp_server; import flaiwheel; print(flaiwheel.__version__)"'

docker run -d \
  --name flaiwheel \
  -p 8080:8080 \
  -p 8081:8081 \
  -e MCP_GIT_REPO_URL=https://github.com/you/yourproject-knowledge.git \
  -e MCP_GIT_TOKEN=ghp_your_token \
  -v flaiwheel-data:/data \
  flaiwheel:latest

Upgrading an existing container? Run the smoke test above first, then rename the old container instead of removing it (docker rename flaiwheel flaiwheel-rollback) so you can restore it instantly if the new one fails its health check. Confirm every knowledge repo is pushed (git rev-list --count @{u}..HEAD0) before swapping.

3. Connect your AI agent

Cursor — add to .cursor/mcp.json:

{
  "mcpServers": {
    "flaiwheel": {
      "type": "sse",
      "url": "http://localhost:8081/sse"
    }
  }
}

VS Code / GitHub Copilot (1.99+) — add to .vscode/mcp.json:

{
  "servers": {
    "flaiwheel": {
      "type": "sse",
      "url": "http://localhost:8081/sse"
    }
  }
}

Then: Command Palette → MCP: List Servers → start flaiwheel.

Claude Desktop (macOS app) — add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "flaiwheel": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "http://localhost:8081/sse"]
    }
  }
}

Requires Node.js. Restart Claude for Mac after editing.

Claude Code CLI — run once in your project directory:

claude mcp add --transport sse --scope project flaiwheel http://localhost:8081/sse

4. Done. Start coding.


Knowledge Repo Structure

yourproject-knowledge/
├── README.md              ← overview / index
├── architecture/          ← system design, decisions, diagrams
├── api/                   ← endpoint docs, contracts, schemas
├── bugfix-log/            ← auto-generated bugfix summaries
│   └── 2026-02-25-fix-payment-retry.md
├── best-practices/        ← coding standards, patterns
├── setup/                 ← deployment, environment setup
├── changelog/             ← release notes
└── tests/                 ← test cases, scenarios, regression patterns

Supported Input Formats

Flaiwheel indexes 9 file formats. All non-markdown files are converted to markdown-like text in memory at index time — no generated files on disk, no repo clutter.

Format

Extension(s)

How it works

Markdown

.md

Native (pass-through)

Plain text

.txt

Wrapped in # filename heading

PDF

.pdf

Text extracted per page via pypdf

HTML

.html, .htm

Headings/lists/code converted to markdown, scripts stripped

reStructuredText

.rst

Heading underlines converted to # levels, code blocks preserved

Word

.docx

Paragraphs + heading styles mapped to markdown

JSON

.json

Pretty-printed in fenced json code block

YAML

.yaml, .yml

Wrapped in fenced yaml code block

CSV

.csv

Converted to markdown table

Quality checks (structure, completeness, bugfix format) apply only to .md files. Other formats are indexed as-is.


Configuration

All config via environment variables (MCP_ prefix), Web UI (http://localhost:8080), or .env file.

Variable

Default

Description

MCP_DOCS_PATH

/docs

Path to .md files inside container

MCP_EMBEDDING_PROVIDER

local

local (free, private) or openai

MCP_EMBEDDING_MODEL

all-MiniLM-L6-v2

Embedding model name

MCP_CHUNK_STRATEGY

heading

heading, fixed, or hybrid

MCP_RERANKER_ENABLED

false

Enable cross-encoder reranker for higher precision

MCP_RERANKER_MODEL

cross-encoder/ms-marco-MiniLM-L-6-v2

Reranker model name

MCP_RRF_K

60

RRF k parameter (lower = more weight on top ranks)

MCP_RRF_VECTOR_WEIGHT

1.0

Vector search weight in RRF fusion

MCP_RRF_BM25_WEIGHT

1.0

BM25 keyword search weight in RRF fusion

MCP_MIN_RELEVANCE

0

Minimum relevance % to return (0 = no filter)

MCP_GIT_REPO_URL

Knowledge repo URL (enables git sync)

MCP_GIT_BRANCH

main

Branch to sync

MCP_GIT_TOKEN

GitHub token for private repos

MCP_GIT_SYNC_INTERVAL

300

Pull interval in seconds (0 = disabled)

MCP_GIT_AUTO_PUSH

true

Auto-commit + push bugfix summaries

MCP_GITLEAKS_MODE

block

Secret scan before auto-commit: block (refuse), warn (commit + report), off

MCP_WEBHOOK_SECRET

GitHub webhook secret (enables /webhook/github HMAC verification)

MCP_TRANSPORT

sse

MCP transport: sse or stdio

MCP_SSE_PORT

8081

MCP SSE endpoint port

MCP_WEB_PORT

8080

Web UI port

Multi-Repo Support

A single Flaiwheel container can manage multiple knowledge repositories — one per project. Each project gets its own ChromaDB collection, git watcher, index lock, health tracker, and quality checker, while sharing one embedding model in RAM and one MCP/Web endpoint.

How it works:

  • The first install.sh run creates the Flaiwheel container with project A

  • Subsequent install.sh runs from other project directories detect the running container and register the new project via the API — no additional containers

  • All MCP tools accept an optional project parameter (e.g., search_docs("query", project="my-app"))

  • Call set_project("my-app") at the start of every conversation to bind all subsequent calls to that project (sticky session)

  • Without an explicit project parameter, the active project (set via set_project) is used; if none is set, the first project is used

  • The Web UI has a project selector dropdown to switch between projects

  • Use list_projects() via MCP to see all registered projects (shows active marker)

Adding/removing projects:

  • Via AI agent: call setup_project(name="my-app", git_repo_url="...") — registers, clones, indexes, and auto-binds

  • Via install script: run install.sh from a new project directory (auto-registers)

  • Via Web UI: click "Add Project" in the project selector bar

  • Via API: POST /api/projects with {name, git_repo_url, git_branch, git_token}

  • Remove: DELETE /api/projects/{name} or the "Remove" button in the Web UI

Backward compatibility: existing single-project setups continue to work without changes. If no projects.json exists but MCP_GIT_REPO_URL is set, Flaiwheel auto-creates a single project from the env vars.

Embedding Model Hot-Swap

When you change the embedding model via the Web UI, Flaiwheel re-embeds all documents in the background using a shadow collection. Search remains fully available on the old model while the migration runs. Once complete, the new index atomically replaces the old one — zero downtime.

The Web UI shows a live progress bar with file count and percentage. You can cancel at any time.

Embedding Models (local, free)

Model

RAM

Quality

Best for

all-MiniLM-L6-v2

90MB

78%

Large repos, low RAM

nomic-ai/nomic-embed-text-v1.5

520MB

87%

Best English quality

BAAI/bge-m3

2.2GB

86%

Multilingual (DE/EN)

Select via Web UI or MCP_EMBEDDING_MODEL env var. Full list in the Web UI.

Cross-Encoder Reranker (optional)

The reranker is a second-stage model that rescores the top candidates from hybrid search. It reads the full (query, document) pair together, which produces much more accurate relevance scores than independent embeddings — especially for vocabulary-mismatch queries where the user and the document use different words for the same concept.

How it works:

  1. Hybrid search (vector + BM25) retrieves a wider candidate pool (top_k × 5)

  2. RRF merges and ranks the candidates

  3. The cross-encoder rescores the top candidates and returns only the best top_k

Enable via Web UI (Search & Retrieval card) or environment variable:

docker run -d \
  -e MCP_RERANKER_ENABLED=true \
  -e MCP_RERANKER_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2 \
  ...

Reranker Model

RAM

Speed

Quality

cross-encoder/ms-marco-MiniLM-L-6-v2

90MB

Fast

Good — best speed/quality balance

cross-encoder/ms-marco-MiniLM-L-12-v2

130MB

Medium

Better — higher precision

BAAI/bge-reranker-base

420MB

Slower

Best — state-of-the-art accuracy

The reranker is off by default (zero overhead). When enabled, it adds ~50ms latency per search but typically improves precision by 10-25% on vocabulary-mismatch queries.

GitHub Webhook (instant reindex)

Instead of waiting for the 300s polling interval, configure a GitHub webhook for instant reindex on push:

  1. In your knowledge repo on GitHub: Settings → Webhooks → Add webhook

  2. Payload URL: http://your-server:8080/webhook/github

  3. Content type: application/json

  4. Secret: set the same value as MCP_WEBHOOK_SECRET

  5. Events: select "Just the push event"

The webhook endpoint verifies the HMAC signature if MCP_WEBHOOK_SECRET is set. Without a secret, any POST triggers a pull + reindex.

CI Guardrail Telemetry (ROI tracking)

Track non-vanity engineering impact directly in Flaiwheel:

  • POST /api/telemetry/ci-guardrail-report — CI reports guardrail findings/fixes per PR

  • GET /api/impact-metrics?project=<name>&days=30 — returns estimated time saved + regressions avoided

Example payload:

{
  "project": "my-app",
  "violations_found": 4,
  "violations_blocking": 1,
  "violations_fixed_before_merge": 2,
  "cycle_time_baseline_minutes": 58,
  "cycle_time_actual_minutes": 43,
  "pr_number": 127,
  "branch": "feature/payment-fix",
  "commit_sha": "abc1234",
  "source": "github-actions"
}

Flaiwheel persists telemetry on disk (<vectorstore>/telemetry) so metrics survive container restarts and updates.

Diff-aware Reindexing

Reindexing is incremental by default — only files whose content changed since the last run are re-embedded. On a 500-file repo, this means a typical reindex after a single-file push takes <1s instead of re-embedding everything.

Use reindex(force=True) via MCP or the Web UI "Reindex" button to force a full rebuild (e.g. after changing the embedding model).


Architecture

┌─────────────────────────────────────────────────────────────┐
│  Docker Container (single process, N projects)               │
│                                                              │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  Web-UI (FastAPI)                        Port 8080    │  │
│  │  Project CRUD, config, monitoring, search, health     │  │
│  └─────────────────────┬─────────────────────────────────┘  │
│                         │ shared state (ProjectRegistry)     │
│  ┌─────────────────────┴─────────────────────────────────┐  │
│  │  MCP Server (FastMCP)                    Port 8081    │  │
│  │  30 tools (search, write, classify, manage, projects,│  │
│  │           relations, timeline)                        │  │
│  └─────────────────────┬─────────────────────────────────┘  │
│                         │                                    │
│  ┌─────────────────────┴─────────────────────────────────┐  │
│  │  Shared Embedding Model (1× in RAM)                   │  │
│  └─────────────────────┬─────────────────────────────────┘  │
│                         │                                    │
│  ┌──────────────────────┴────────────────────────────────┐  │
│  │  Per-Project Contexts (isolated)                      │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐   │  │
│  │  │  Project A  │  │  Project B  │  │  Project C  │   │  │
│  │  │  collection │  │  collection │  │  collection │   │  │
│  │  │  watcher    │  │  watcher    │  │  watcher    │   │  │
│  │  │  lock       │  │  lock       │  │  lock       │   │  │
│  │  │  health     │  │  health     │  │  health     │   │  │
│  │  │  quality    │  │  quality    │  │  quality    │   │  │
│  │  └─────────────┘  └─────────────┘  └─────────────┘   │  │
│  └───────────────────────────────────────────────────────┘  │
│                                                              │
│  /docs/{project}/  ← per-project knowledge repos             │
│  /data/            ← shared vectorstore + config + projects  │
└─────────────────────────────────────────────────────────────┘

Search Pipeline

query
  │
  ├──► Vector Search (ChromaDB/HNSW, cosine similarity)
  │         fetch top_k (or top_k×5 if reranker enabled)
  │
  ├──► BM25 Keyword Search (bm25s, English stopwords)
  │         fetch top_k (or top_k×5 if reranker enabled)
  │
  ├──► RRF Fusion (configurable k, vector/BM25 weights)
  │         merge + rank candidates
  │
  ├──► [optional] Cross-Encoder Reranker
  │         rescore (query, doc) pairs for higher precision
  │
  ├──► Min Relevance Filter (configurable threshold)
  │
  └──► Return top_k results with relevance scores

Web UI

Access at http://localhost:8080 (HTTP Basic Auth — credentials shown on first start).

Features:

  • System health panel: last index, last git pull, git commit, version, search metrics, quality score, skipped files count

  • Index status and statistics (including reranker status)

  • Embedding model selection (visual picker)

  • Search & Retrieval tuning: cross-encoder reranker toggle + model picker, RRF weights, minimum relevance threshold

  • Chunking strategy configuration

  • Git sync settings (URL, branch, auto-push toggle)

  • Test search interface

  • Knowledge quality checker (also runs automatically after every reindex)

  • Search metrics (hits/total, miss rate, per-tool breakdown)

  • Skipped files indicator (files excluded from indexing due to critical quality issues)

  • "This is the Way" — Knowledge Bootstrap: agent-driven project classification + in-repo cleanup (Web UI shows guidance + advanced scan)

  • Multi-project switcher (manage multiple repos from one instance)

  • Client configuration snippets (Cursor, Claude Desktop, Docker)

  • Password management


Development

# Clone
git clone https://github.com/dl4rce/flaiwheel.git
cd flaiwheel

# Install
pip install -e ".[dev]"

# Run tests (259 tests covering readers, quality checker, indexer, reranker, health tracker, MCP tools, model migration, multi-project, bootstrap, classification, file-context, cold-start analyzer)
pytest

# Run locally (needs /docs and /data directories)
mkdir -p /tmp/flaiwheel-docs /tmp/flaiwheel-data
MCP_DOCS_PATH=/tmp/flaiwheel-docs MCP_VECTORSTORE_PATH=/tmp/flaiwheel-data python -m flaiwheel

License

Business Source License 1.1 (BSL 1.1)

Flaiwheel is source-available under the Business Source License 1.1.

You may use Flaiwheel for free if:

  • Your use is non-commercial (personal, educational, no revenue), or

  • Your organization has no more than 10 individuals using it

Commercial use beyond these limits (e.g., teams of 11+ or commercial deployment) requires a paid license.

See LICENSE for full terms.

Available Tools

30 tools
analyze_codebaseA

Analyze a source code directory and return a cold-start bootstrap report. Read-only.

    Does not modify source files or the vector index. Runs entirely
    server-side using Python ast, regex, and local MiniLM embeddings —
    no cloud calls, no token cost.

    The report is cached at /data/coldstart-{project}.md after the first
    run and returned instantly on subsequent calls. Use force=True only
    after significant code changes — not for routine sessions.

    Use at the START of work on an unfamiliar codebase instead of reading
    dozens of files. Then use the write_*() tools to document the top
    files identified in the report. Use classify_documents() for existing
    .md files in the project repo.

    The path must be accessible inside the Docker container (i.e. mounted
    as a volume). It cannot reach paths on the host that are not mounted.

    Args:
        path: Absolute path to the source directory to scan
        force: Regenerate even if a cached report exists (default: False)
        project: Target project name (optional)

    Returns:
        Markdown report (~5–20 KB) with language distribution, category map,
        top 20 files ranked by documentability, near-duplicate file pairs,
        undocumented directories, and recommended next steps.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
forceNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

No annotations are provided, so the description fully discloses behavior: read-only, no modifications, server-side execution, no cloud calls or token cost, caching with instant return on subsequent calls, and path mount requirements. No contradictions.

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

Conciseness4/5

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

The description is well-structured with a lead sentence, bullet-style paragraphs, and explicit Args/Returns sections. It contains necessary details without excessive verbosity. Slightly long but justified by the need to cover behavior, caching, and usage context.

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

Completeness5/5

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

Given the tool's complexity and the presence of an output schema (Markdown report), the description covers input parameters, behavior, caching policy, usage timing, and alternative tools. It provides complete context for an agent to select and invoke this tool correctly.

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

Parameters5/5

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

Schema description coverage is 0%, but the description explains all parameters: path (absolute path in container), force (regenerate cache, default False), project (optional). It also describes the return value (Markdown report with specific sections). This compensates fully for the missing schema descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Analyze a source code directory and return a cold-start bootstrap report.' It uses a specific verb and resource, and distinguishes itself from siblings like classify_documents and write_* tools, which are mentioned for subsequent steps.

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

Usage Guidelines5/5

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

Explicit guidance is provided: 'Use at the START of work on an unfamiliar codebase instead of reading dozens of files.' It advises against frequent use of force=True and directs users to alternative tools (write_*, classify_documents) for subsequent tasks. Also notes path accessibility constraints.

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

analyze_knowledge_repoA

Analyse the knowledge repo for structure issues, duplicates, and misplaced files.

    Read-only — no files are modified. Scans files already inside the
    knowledge repo (inside the Docker volume), not the project source repo.
    Caches the report in memory so execute_cleanup() can act on it in the
    same session.

    To classify and migrate files from the project source repo use
    classify_documents() instead. For a simpler quality check without
    cleanup proposals use check_knowledge_quality().

    Args:
        project: Target project name (optional)

    Returns:
        Structured report with file counts by category, duplicate pairs,
        misplaced files, and numbered proposed cleanup actions (a1, a2, …)
        ready for execute_cleanup().
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Declares read-only nature, scope (knowledge repo inside Docker volume), and caching behavior. No contradiction with missing annotations.

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

Conciseness4/5

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

Well-structured with a clear intro line and bullet points; covers key aspects without excessive verbosity.

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

Completeness4/5

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

Mentions output structure and integration with execute_cleanup. Output schema covers return values. Missing prerequisites but overall adequate.

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

Parameters3/5

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

Describes the single optional parameter briefly ('Target project name (optional)'), but lacks detail on how it affects analysis. Schema has no descriptions, so description adds minimal value.

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

Purpose5/5

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

Explicitly states 'Analyse the knowledge repo for structure issues, duplicates, and misplaced files' and distinguishes from siblings like classify_documents and check_knowledge_quality.

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

Usage Guidelines5/5

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

Provides specific when-to-use guidance: for classification use classify_documents, for simpler quality check use check_knowledge_quality, and notes that the report is cached for execute_cleanup.

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

check_knowledge_qualityA

Validate the knowledge base for consistency and structural correctness. Read-only.

    Does not modify any files or the vector index. Use periodically
    or after adding many documents to spot quality regressions.
    Use validate_doc() instead to check a single document before committing.
    Use get_index_stats() to check chunk counts rather than quality.

    Args:
        project: Target project name (optional)

    Returns:
        Quality score 0–100, counts of critical/warning/info issues,
        and a per-file issue list tagged [!] critical, [~] warning, [i] info.
        Critical issues cause files to be skipped during indexing.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

The description explicitly states 'Read-only. Does not modify any files or the vector index.' This is critical behavioral info. Since no annotations are provided, the description fully bears the burden and addresses it well. It also explains return format with quality score and issue categories.

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

Conciseness5/5

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

The description is well-structured with a summary, usage guidance, and parameter/return details. Every sentence is informative; no fluff. It is appropriately sized for the tool's complexity.

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

Completeness4/5

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

Given one simple optional parameter and no required params or nested objects, the description is thorough. It explains behavioral aspects, usage context, and return format. Lacks mention of error handling or edge cases, but sufficient for a read-only validation tool.

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

Parameters4/5

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

There is one optional parameter 'project'. The schema has no description (coverage 0%), so the description's mention 'Target project name (optional)' adds meaning. However, it does not elaborate on default behavior or domain, which could be valuable.

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

Purpose5/5

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

The description clearly states 'Validate the knowledge base for consistency and structural correctness' using a specific verb and resource. It distinguishes from siblings by referencing validate_doc() and get_index_stats(), providing clear differentiation.

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

Usage Guidelines5/5

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

The description explicitly advises when to use: 'Use periodically or after adding many documents to spot quality regressions.' It also gives alternatives: 'Use validate_doc() instead to check a single document before committing. Use get_index_stats() to check chunk counts rather than quality.'

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

check_updateA

Check whether a newer Flaiwheel version is available on GitHub. Read-only.

    Makes a single network request to GitHub (git ls-remote) to compare
    version tags against the running version. No files are modified.
    Use when you suspect Flaiwheel may be outdated, or periodically to
    keep the server current.

    Returns:
        "Up to date" message, or the available version number plus the
        exact bash command to give the user for upgrading.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool is read-only, makes a single network request using git ls-remote, and does not modify files. However, it does not mention potential network failures or rate limits, which are minor omissions for a simple check.

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

Conciseness5/5

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

The description is concise and well-structured: a clear one-line summary, followed by detailed behavioral notes in a single paragraph, and a bullet-like list of return values. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given no parameters and no annotations, the description provides all necessary information: purpose, behavior, usage guidance, and return values. The presence of an output schema (as indicated by context signals) further reduces the need to describe return structure in detail.

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

Parameters4/5

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

The tool has no parameters, and schema coverage is 100% (empty). The description adds value by explaining the return format ('Up to date' message or version number with upgrade command), which is beyond the schema. Baseline for zero parameters is 4.

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

Purpose5/5

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

The description clearly states the tool checks for a newer Flaiwheel version on GitHub. It includes a specific verb ('check') and resource ('Flaiwheel version'), and distinguishes itself from sibling tools, none of which serve a similar update-checking purpose.

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

Usage Guidelines4/5

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

The description explicitly says when to use the tool: 'when you suspect Flaiwheel may be outdated, or periodically to keep the server current.' Although it does not mention when not to use it or alternatives, the context of sibling tools doesn't imply any overlapping functionality, so the guidance is sufficient.

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

classify_documentsA

Classify project repo documents for migration into the knowledge base. Read-only.

    Does not write any files. The agent reads project files locally and
    passes their content here; the Docker container cannot access the
    project source repo directly. Flaiwheel classifies each file by
    semantic similarity and returns a migration plan.

    Trigger: user says "This is the Way" or "42".
    Step 1 of the migration workflow — after classification, use the
    suggested write_*() tool for each file to push it into the knowledge base.
    Use analyze_knowledge_repo() instead when files are already inside the
    knowledge repo and need reorganisation.

    Args:
        files: JSON array of {"path": "...", "content": "..."} objects.
               Send the first ~2000 characters of each file as content.
               Example: [{"path": "docs/auth.md", "content": "# Auth..."}]
        project: Target project name (optional)

    Returns:
        Per-file classification (category, suggested write_*() tool),
        duplicate detection, and a step-by-step migration plan.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
filesYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It clearly states read-only nature, explains that agent reads files locally and passes content, and that Docker container cannot access source repo. However, lacks details on rate limits, auth, or error handling.

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

Conciseness5/5

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

Description is well-structured with clear sections: purpose, read-only note, trigger, step, alternative, parameter details, and return summary. Front-loaded with key info, no redundant sentences.

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

Completeness5/5

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

Given the tool's complexity (classifying multiple files), description covers workflow, input format, output (classification, duplicates, plan), and integration with other tools. Output schema exists, so return values are adequately summarized.

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

Parameters5/5

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

Schema coverage is 0%, but description adds rich details: for 'files' parameter it explains format (JSON array of objects with path and content), recommends sending first ~2000 characters, and provides example. For 'project' it describes as optional target project name.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Classify project repo documents for migration into the knowledge base.' It also specifies it is read-only, step 1 of migration, and distinguishes from sibling tool analyze_knowledge_repo().

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

Usage Guidelines5/5

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

Explicitly provides trigger phrase ('This is the Way' or '42'), states when to use (step 1 after which write_* tools are used), and when not (use analyze_knowledge_repo() for files already in knowledge repo).

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

execute_cleanupA

Execute approved cleanup actions from analyze_knowledge_repo().

    Side effects: moves files within the knowledge repo using git mv
    (preserves git history) and creates missing category directories.
    NEVER deletes any file. Requires analyze_knowledge_repo() to have
    been called first in this session.

    Use "all" to execute every proposed action, or pass a comma-separated
    list of specific action IDs (e.g. "a1,a3") to cherry-pick.
    Call reindex() after cleanup to rebuild the search index.

    Args:
        actions: Comma-separated action IDs from the analysis report,
                 e.g. "a1,a2,a5", or "all" to execute everything
        project: Target project name (optional)

    Returns:
        Per-action results (directories created, files moved), any errors,
        and a rollback command to undo the moves if needed.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
actionsYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavioral traits: it moves files using git mv, creates directories, and explicitly states 'NEVER deletes any file'. It also mentions return values and a rollback command.

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

Conciseness5/5

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

The description is concise at ~150 words, well-structured with clear sections, and front-loaded with the primary purpose. Each sentence provides valuable information without redundancy.

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

Completeness5/5

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

Given the simple parameter structure and presence of an output schema, the description covers prerequisites, side effects, usage patterns, and return values, making it fully informative.

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

Parameters5/5

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

Despite 0% schema description coverage, the description fully explains both parameters with examples and format: 'actions: Comma-separated action IDs... e.g. "a1,a2,a5" or "all"' and 'project: Target project name (optional)'. 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.

Purpose5/5

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

The description clearly states the tool's purpose: 'Execute approved cleanup actions from analyze_knowledge_repo().' It specifies the verb (execute) and resource (cleanup actions), and distinguishes it from sibling tools like analyze_knowledge_repo.

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

Usage Guidelines5/5

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

The description explicitly states prerequisites ('Requires analyze_knowledge_repo() to have been called first') and follow-up steps ('Call reindex() after cleanup'), providing clear context for when and how to use the tool.

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

get_active_projectA

Show the active project for this session. Read-only, no side effects.

    Use to verify which project is bound before making tool calls.
    Use set_project() to change the binding. Use list_projects() to see
    all registered projects and their stats.

    Returns:
        Active project name, chunk count, and docs path when bound.
        Instructions to call set_project() or setup_project() when not bound.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

The description explicitly declares 'Read-only, no side effects,' which is a clear behavioral trait. It also describes the return values, providing full transparency without annotations. This is well above the minimum required.

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

Conciseness5/5

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

The description is concise with two short sentences plus a usage notes section and return description. It is front-loaded with the core purpose and every sentence earns its place. No waste.

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

Completeness5/5

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

Given the tool's simplicity and the presence of an output schema, the description provides complete context: what it does, when to use it, alternatives, and return values. No additional information is needed.

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

Parameters4/5

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

With zero parameters and 100% schema coverage, the description adds value by explaining the return values. Baseline is 4 for zero-parameter tools, and the description enhances understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'Show' and resource 'active project', and distinguishes from sibling tools by explicitly mentioning set_project() and list_projects() as alternatives for changing or listing projects. This provides a specific and differentiated purpose.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('to verify which project is bound before making tool calls') and directs to set_project() for changing the binding and list_projects() for viewing all projects. This provides clear when-to-use and alternative context.

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

get_file_contextA

Retrieve knowledge base context relevant to a specific source file. Read-only.

    Runs multiple semantic searches derived from the filename and returns
    architecture decisions, past bugfixes, and best practices related to
    that file — without requiring a manual search query. No files modified.

    Complements get_recent_sessions() (temporal context) with file-level
    spatial context. Use before reading or editing any source file.
    Use search_docs() for free-form queries not tied to a specific file.

    Args:
        filename: File path or name being opened/edited, e.g.
                  "payment.service.ts" or "src/auth/jwt.py"
        project: Target project name (optional)

    Returns:
        Relevant architecture docs, bugfix summaries, and best practices
        for the given file, ranked by relevance. Returns "no context found"
        when the knowledge base has nothing for that file yet.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo
filenameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Without annotations, the description fully discloses read-only nature ('No files modified', 'Read-only'), the semantic search process, and return behavior including the 'no context found' case.

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

Conciseness5/5

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

The description is well-structured with a summary, details, args section, and returns section. Every sentence is meaningful and concise, with no wasted words.

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

Completeness5/5

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

Given the presence of an output schema (mentioned in context signals), the description appropriately explains the return content and edge case, providing sufficient completeness for agent decision-making.

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

Parameters5/5

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

With 0% schema coverage, the description adds valuable context: filename is explained with examples ('payment.service.ts' or 'src/auth/jwt.py') and project is described as optional target project name.

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

Purpose5/5

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

The description clearly states 'Retrieve knowledge base context relevant to a specific source file' with a specific verb and resource, and explicitly distinguishes from siblings like get_recent_sessions and search_docs.

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

Usage Guidelines5/5

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

It explicitly states when to use ('before reading or editing any source file'), when not to use ('Use search_docs() for free-form queries not tied to a specific file'), and names an alternative (get_recent_sessions).

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

get_index_statsA

Show vector index statistics for the active project. Read-only, no side effects.

    Use to check how many chunks are indexed, verify a reindex completed,
    or inspect the embedding model and chunking configuration.
    Use check_knowledge_quality() instead when you want quality issues, not stats.

    Args:
        project: Target project name (optional)

    Returns:
        Total chunk count, docs path, embedding provider and model,
        chunking strategy, and per-document-type chunk distribution.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, but description declares read-only, no side effects, and lists return fields. Some missing details like permissions or error handling, but sufficient.

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

Conciseness4/5

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

Well-structured with paragraphs and bullet points, concise with essential information. Slightly verbose in returning details, but acceptable.

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

Completeness5/5

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

In context of one optional parameter and output schema, description covers purpose, usage, and return values completely.

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

Parameters3/5

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

Schema description coverage is 0%, but description adds meaning for 'project' as optional target project name. Adequate but not extensive.

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

Purpose5/5

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

Description clearly states it shows vector index statistics, is read-only, and distinguishes itself from sibling tool check_knowledge_quality.

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

Usage Guidelines5/5

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

Explicitly states when to use (check chunk counts, verify reindex, inspect config) and when not to (use check_knowledge_quality for quality issues), providing clear alternatives.

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

get_recent_sessionsA

Retrieve recent session summaries to restore context. Read-only.

    Reads from /data/sessions-{project}.json. Does not modify any data.
    Call at the START of every session before any other tools to understand
    what was done previously and pick up open questions.
    Use save_session_summary() at the END of a session to store context.

    Args:
        limit: Number of most-recent sessions to return (default: 5, max: 20)
        project: Target project name (optional)

    Returns:
        Timestamped session entries showing summary, decisions, open
        questions, and modified files for each session, newest first.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

No annotations provided, but description fully discloses behavior: reads from /data/sessions-{project}.json, does not modify data, and describes output structure (timestamped entries with summary, decisions, etc.).

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

Conciseness5/5

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

Concise, front-loaded with key info, no waste. Structured logically: purpose, file location, usage, parameters, return value. Every sentence adds value.

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

Completeness5/5

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

With output schema present, description explains return values sufficiently. Covers all aspects: purpose, usage, behavior, parameters, and output. No gaps.

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

Parameters5/5

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

Schema has 0% coverage (no descriptions), but description fully documents both parameters: limit (default 5, max 20) and project (optional). Compensates for schema gap.

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

Purpose5/5

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

Clear verb ('retrieve'), resource ('session summaries'), and purpose ('restore context'). Explicitly notes read-only nature, distinguishing it from sibling tools like save_session_summary.

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

Usage Guidelines5/5

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

Provides explicit when-to-use: 'Call at the START of every session before any other tools' and when-to-use alternative: 'Use save_session_summary() at the END of a session to store context.' No ambiguity.

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

git_pull_reindexA

Pull latest commits from the knowledge repo git remote, then re-index.

    Call this AFTER pushing .md files to the knowledge repo. Runs
    'git pull' on the cloned docs directory, then re-indexes only changed
    files. No-op if the repo is already up to date.

    Requires MCP_GIT_REPO_URL to be configured. Use reindex() instead
    when files were written locally (not via git push).

    Args:
        project: Target project name (optional)

    Returns:
        "Already up to date" if no changes, otherwise files indexed,
        chunks upserted, and stale chunks removed.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Describes the workflow (git pull then re-index only changed files), notes it's a no-op if up-to-date, and indicates what returns. Lacks explicit mention of network usage or potential side effects, but covers main behavior.

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

Conciseness5/5

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

Description is concise, uses bullet points for clarity, and front-loads the main purpose. Every sentence adds value.

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

Completeness4/5

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

Given the presence of an output schema, the description covers prerequisites, behavior variations, and return states. Could elaborate on project parameter usage, but overall sufficient.

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

Parameters2/5

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

The single parameter 'project' is only described as 'Target project name (optional)', which adds no meaning beyond the schema's type and default. With 0% schema coverage, the description should provide more context, e.g., how project filtering works or what default project is used.

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

Purpose5/5

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

The description clearly states the action (pull and re-index), the trigger (after pushing .md files), and distinguishes from the sibling tool 'reindex' by specifying when to use each.

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

Usage Guidelines5/5

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

Explicitly states when to call (after pushing .md files), when not to (use reindex for local writes), and mentions the prerequisite MCP_GIT_REPO_URL configuration.

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

list_projectsA

List all registered projects with chunk counts and health stats. Read-only.

    Use to check which projects exist, their index sizes, quality scores,
    and git repo URLs. Use get_active_project() to check only the active
    project for the current session.

    Returns:
        Per-project summary: name (with active marker), total chunks,
        quality score, docs path, and git repo URL if configured.
        Returns setup instructions when no projects are registered.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description fully bears the burden of behavioral disclosure. It explicitly declares 'Read-only', which is the key behavioral trait for a list operation. It also describes the return value in detail, including the per-project summary and the empty state behavior. No side effects or auth requirements are mentioned, but for a read-only list, this is adequate.

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

Conciseness5/5

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

The description is concise and well-structured: a single sentence stating the core functionality, then a 'Use to' section, and a 'Returns' section. Every sentence adds value, with no redundancy or unnecessary detail. It is front-loaded with the main purpose.

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

Completeness5/5

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

Given zero parameters, no annotations, and the presence of an output schema, the description is complete. It explains the output per project (name, chunks, quality score, docs path, git repo URL) and the behavior when no projects are registered. No gaps remain for an agent to effectively use this tool.

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

Parameters4/5

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

The input schema has zero parameters, and schema description coverage is 100% vacuously. The description adds no parameter-specific information, but with no parameters to describe, a baseline score of 4 is appropriate as the description compensates by explaining the output.

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

Purpose5/5

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

The description uses the specific verb 'list' and the resource 'projects', clearly stating it lists all registered projects with chunk counts and health stats. It distinguishes itself from the sibling tool 'get_active_project' by noting that the latter checks only the active project, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description explicitly states when to use the tool ('to check which projects exist...') and provides a clear alternative ('Use get_active_project() to check only the active project'). It also mentions the behavior for empty projects. While it could include explicit 'when not to use' guidance, the context is sufficient for an agent.

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

reindexA

Re-index the knowledge base docs into the vector store.

    Modifies the vector index in place. Does not modify source .md files.
    By default only re-embeds changed files (fast, diff-aware). Set
    force=True to rebuild all embeddings from scratch — use this after
    changing the embedding model, not for routine updates.

    Use git_pull_reindex() instead when the docs changes came from a
    git push to the knowledge repo.

    Args:
        force: Rebuild all embeddings from scratch, not just changed files
               (default: False — use only when changing embedding model)
        project: Target project name (optional)

    Returns:
        Files indexed, changed, skipped; chunks upserted; stale chunks removed.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Describes in-place modification, no source file changes, diff-aware default, and force rebuild behavior. Mentions stale chunk removal but lacks potential side effects or auth details. With no annotations, description carries full burden and does well.

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

Conciseness4/5

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

Well-structured with intro, bullet points, and returns section. Not overly verbose, but could be slightly more compact.

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

Completeness5/5

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

Covers purpose, behavior, parameters, and return values. Output schema exists but description's Returns section is sufficient. No missing information for a reindex tool.

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

Parameters5/5

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

Schema coverage is 0%, so description compensates fully. Explains force parameter (purpose and when to use) and project parameter (target project). Adds meaning beyond schema defaults and types.

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

Purpose5/5

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

The description clearly states 'Re-index the knowledge base docs into the vector store' with specific verb and resource. It distinguishes from sibling tool git_pull_reindex by noting its better fit for git-push changes.

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

Usage Guidelines5/5

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

Explicitly advises when to use force=True (after changing embedding model) and when to prefer git_pull_reindex (for git-sourced changes). Provides clear default behavior (diff-aware).

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

relationsA

Return structured relations for an entity, derived from YAML frontmatter. Read-only.

    Entities and edges are declared **explicitly** in markdown frontmatter:

        ---
        id: adr-0042
        type: architecture
        replaces: [adr-0017]
        depends_on: [service-summarizer]
        status: active
        ---

    Recognised relation keys: replaces, depends_on, fixes, implements.
    Use timeline() to see when the doc holding an entity changed over time.

    Args:
        entity_id: Frontmatter ``id`` value of the entity to resolve
        project: Target project name (optional)

    Returns:
        Markdown showing the entity, its outbound edges (declared on
        this doc), and inbound edges (other docs that reference it).
        Lists are truncated; entities not found return a hint.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo
entity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: read-only, lists recognized relation keys, explains output format (Markdown with truncation and not-found hints), and describes how relations are declared in frontmatter. This exceeds expectations.

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

Conciseness4/5

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

The description is well-structured with a summary first, then a YAML example, recognized keys, args, and returns. It's longer but each part adds value. Minor conciseness issues: the example could be shorter, but overall front-loading is effective.

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

Completeness5/5

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

Given the tool's complexity and that an output schema exists, the description is complete: it explains behavior, truncation, not-found hints, recognized keys, and references an alternative tool. No gaps in context.

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

Parameters4/5

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

Schema description coverage is 0%, but the description explains entity_id as the frontmatter 'id' value and project as an optional target project name, adding meaning beyond schema types and defaults. It could be more explicit about project's role, but it's good.

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

Purpose5/5

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

The description clearly states the tool returns structured relations for an entity from YAML frontmatter, uses specific verbs like 'Return structured relations', and distinguishes from siblings like timeline() by mentioning it as an alternative for change history. It lists recognized relation keys, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context on when to use (to resolve an entity's relations) and explicitly suggests timeline() for change history. However, it does not explicitly state when not to use this tool or provide alternatives for tasks like listing all entities or searching, but the context is sufficient for most agents.

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

save_session_summaryA

Append a session summary to the project's session log.

    Side effects: appends a JSON entry to /data/sessions-{project}.json.
    Does not modify the vector index or the knowledge repo. Safe to call
    multiple times in one session — each call adds a new entry.

    Call at the END of every session. Use get_recent_sessions() at the
    START of the next session to restore context.

    Args:
        summary: What was accomplished this session (1–3 sentences)
        decisions: Key decisions made, comma-separated (optional)
        open_questions: Unresolved questions or next steps, comma-separated (optional)
        files_modified: Files changed, comma-separated (optional)
        project: Target project name (optional)

    Returns:
        Confirmation with the project name and total session count stored.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo
summaryYes
decisionsNo
files_modifiedNo
open_questionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Discloses side effects (appends to JSON file, does not modify vector index or knowledge repo), states it is safe to call multiple times, and explains each call adds a new entry. No annotations were provided, so the description fully carries the burden.

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

Conciseness5/5

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

Well-structured with clear sections: main purpose, side effects, usage, arguments, returns. Every sentence adds value, and the information is front-loaded. Despite length, it is appropriately concise for the detail needed.

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

Completeness5/5

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

Covers all necessary aspects: what the tool does, side effects, when to use, parameter details, and return value. With no annotations and a low schema coverage, the description provides complete context for correct agent usage.

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

Parameters5/5

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

The description includes an Args section that explains each parameter's purpose (e.g., summary: 1–3 sentences, decisions: comma-separated, optional). The schema only has types and defaults, so the description adds significant meaning.

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

Purpose5/5

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

The description clearly states the tool appends a session summary to the project's session log, using a specific verb and resource. It distinguishes itself from sibling tools like get_recent_sessions by explaining the complementary usage.

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

Usage Guidelines5/5

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

Explicitly instructs to call at the END of every session and to use get_recent_sessions at the start of the next session, providing clear when-to-use guidance with an alternative tool.

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

search_bugfixesA

Search only bugfix summaries for similar past problems. Read-only, no side effects.

    Prefer this over search_docs() when debugging — it filters to bugfix
    documents only, surfacing root causes and solutions faster.
    Use search_docs() for broader queries that span all doc types.

    Args:
        query: Description of the current problem or error message
        top_k: Number of results (default: 5)
        project: Target project name (optional)

    Returns:
        Ranked bugfix chunks showing root cause, solution, and lessons
        learned, with source file and relevance %. Prompts to call
        write_bugfix_summary() when no matches are found.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Since no annotations are provided, the description fully discloses behavior: it is read-only with no side effects, returns ranked chunks with specific fields, and prompts a follow-up action. This meets the high bar for transparency.

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

Conciseness5/5

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

The description is well-organized with sections (purpose, usage, Args, Returns) and every sentence adds value. No redundancy; it is appropriately concise for the information conveyed.

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

Completeness5/5

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

Given the tool's complexity (3 params, simple return schema), the description covers purpose, usage, parameters, return format, and follow-up actions. No gaps identified.

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

Parameters5/5

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

With 0% schema description coverage, the description adds meaning to all three parameters: query is 'Description of the current problem or error message', top_k has a default, and project is optional. This compensates fully for the schema gap.

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

Purpose5/5

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

The description clearly states 'Search only bugfix summaries for similar past problems', providing a specific verb and resource. It also distinguishes from the sibling tool search_docs by noting its focused scope.

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

Usage Guidelines5/5

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

Explicit guidance is given: prefer this over search_docs when debugging, and use search_docs for broader queries. Also instructs to call write_bugfix_summary when no matches are found.

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

search_by_typeA

Search filtered by a specific document category. Read-only, no side effects.

    Use instead of search_docs() when you know the category — it improves
    precision by restricting results to that type only.
    Use search_bugfixes() or search_tests() as convenient shortcuts for
    those specific categories.

    Args:
        query: Search query (natural language)
        doc_type: Category filter — one of: "architecture", "api",
                  "bugfix", "best-practice", "setup", "changelog",
                  "test", "readme", "docs"
        top_k: Number of results (default: 5)
        project: Target project name (optional)

    Returns:
        Ranked chunks of the specified type with source, relevance %, and text.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
projectNo
doc_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It states 'Read-only, no side effects' and describes the return value as 'Ranked chunks... with source, relevance %, and text.' It does not detail error conditions or rate limits, 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.

Conciseness5/5

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

The description is a single paragraph but well-organized: opening summary, usage instructions, then a clear parameter list. Every sentence is informative and concise. No wasted words.

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

Completeness5/5

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

Given the tool complexity (4 parameters, filtering, no annotations, has output schema), the description covers purpose, usage, parameters, and return value comprehensively. It mentions output format and differentiates from siblings. No critical information is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain parameters. It does: query is 'Search query (natural language)', doc_type lists all allowed values, top_k explains default 5, and project is 'Target project name (optional)'. This adds meaning far beyond the bare schema.

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

Purpose5/5

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

The description clearly states the tool searches documents filtered by a specific category ('Search filtered by a specific document category') and explicitly notes it is read-only with no side effects. It distinguishes itself from sibling tools like search_docs, search_bugfixes, and search_tests by describing when to use each.

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

Usage Guidelines5/5

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

The description provides explicit guidance: 'Use instead of search_docs() when you know the category' and mentions alternatives: 'Use search_bugfixes() or search_tests() as convenient shortcuts for those specific categories.' This clearly tells the agent when to use this tool vs others.

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

search_docsA

Semantic search over the ENTIRE project knowledge base. Read-only, no side effects.

    Use this ALWAYS before writing or changing code to retrieve architecture
    decisions, past bugs, best practices, and API contracts.

    Prefer search_bugfixes() when debugging a specific error (searches only
    bugfix summaries). Use search_by_type() when you know the category.
    Use search_tests() when looking for test coverage.

    Args:
        query: What you want to know (natural language, be specific)
        top_k: Number of results (default: 5, increase for broad questions)
        project: Target project name (optional, defaults to active project)

    Returns:
        Ranked doc chunks, each showing source file:line, section heading,
        relevance %, doc type, and text. Returns a "no results" message with
        a rephrasing suggestion when nothing matches.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: read-only, no side effects, and describes the return format including how 'no results' is handled with a rephrasing suggestion.

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

Conciseness5/5

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

Well-structured with clear sections: purpose, usage guidelines, args, returns. Every sentence is concise and contributes value, no redundancy.

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

Completeness5/5

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

Despite an output schema existing, the description covers all necessary context: purpose, usage rules, parameter semantics, and return details including edge cases. Complete for a search tool.

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

Parameters5/5

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

Schema has 0% description coverage, but the description explains each parameter: query as natural language, top_k with default and usage advice, and project as optional with default behavior, adding significant meaning.

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

Purpose5/5

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

The description clearly states 'Semantic search over the ENTIRE project knowledge base' with 'Read-only, no side effects', distinguishing it from sibling tools like search_bugfixes, search_by_type, and search_tests.

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

Usage Guidelines5/5

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

Explicitly advises 'Use this ALWAYS before writing or changing code' and provides clear alternatives: 'Prefer search_bugfixes() when debugging...', 'Use search_by_type() when you know the category.', 'Use search_tests() when looking for test coverage.'

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

search_testsA

Search test case documents in the knowledge base. Read-only, no side effects.

    Call BEFORE write_test_case() to check what is already covered and
    avoid duplicates. Equivalent to search_by_type(query, "test") but
    more intent-clear for test-coverage workflows.

    Args:
        query: What to search for (e.g. "authentication edge cases")
        top_k: Number of results to return (default: 5)
        project: Target project name (optional)

    Returns:
        Ranked test case chunks with scenario, steps, expected result,
        and status. Returns a prompt to call write_test_case() when empty.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description transparently discloses it is read-only with no side effects. It describes return fields and signals when to call write_test_case, though lacks details on pagination or error handling.

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

Conciseness4/5

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

The description is well-structured with sections for purpose, usage, args, and returns. It is informative but could be slightly more concise; the bullet-like args section is clear.

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

Completeness5/5

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

Given the tool's moderate complexity (3 parameters, output schema exists), the description covers purpose, usage, behavior, parameters, and return values thoroughly without relying on structured fields.

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

Parameters5/5

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

The input schema has 0% description coverage, but the description fully compensates by defining each parameter with examples and defaults, adding meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the tool searches test documents and is read-only. It distinguishes itself from the sibling 'search_by_type' by noting it is more intent-clear for test-coverage workflows.

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

Usage Guidelines5/5

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

Explicitly advises calling this tool before write_test_case() to avoid duplicates. References an alternative (search_by_type) and clarifies when this tool should be used.

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

set_projectA

Bind all subsequent tool calls in this session to a specific project.

    In-memory only — no files are created or modified. The binding is
    per-connection: setting project A in workspace-1 does not affect
    workspace-2. The project= parameter on individual tools overrides
    this session binding for a single call.

    Call at the START of every session. Use setup_project() to create
    a new project. Use get_active_project() to check the current binding.

    Args:
        name: Name of a registered project (see list_projects())

    Returns:
        Active project name, chunk count, and docs path on success.
        Lists available projects and suggests setup_project() on failure.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

No annotations provided, but description fully discloses in-memory only, no file modification, per-connection binding, and return value details for success and failure.

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

Conciseness5/5

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

Well-structured with bullet points, front-loaded with primary purpose, no wasted words. Every sentence adds value.

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

Completeness5/5

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

Single parameter with output schema; description explains purpose, usage pattern, return values, error handling, and differentiates from many sibling tools.

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

Parameters5/5

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

Schema has 0% description coverage, but description adds that 'name' must be a registered project from list_projects(), providing essential context beyond the schema.

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

Purpose5/5

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

Description clearly states it binds all subsequent tool calls to a specific project, and distinguishes from sibling tools setup_project (create new) and get_active_project (check binding).

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

Usage Guidelines5/5

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

Explicitly instructs to call at the START of every session, and explains when to use setup_project or get_active_project instead. Also clarifies override behavior with project= parameter.

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

setup_projectA

Register and initialise a new project in Flaiwheel.

    Side effects: creates a project directory under MCP_DOCS_PATH, optionally
    clones the git knowledge repo, runs an initial index, and binds this
    session to the new project. Idempotent — safe to call again if the
    project already exists (just rebinds the session).

    Call once per project. Use set_project() to switch between already
    registered projects. Use list_projects() to see what exists.

    Args:
        name: Short project identifier, no spaces (e.g. "my-app")
        git_repo_url: HTTPS URL of the knowledge git repo (optional,
                      can be added later via the Web UI)
        git_branch: Branch to track for git sync (default: "main")
        display_name: Human-readable label shown in the Web UI (optional)
        git_auto_push: Auto-commit and push write_*() docs to git (default: True)
        git_sync_interval: Background git pull interval in seconds (default: 300)

    Returns:
        Project name, chunk count, active-project confirmation, and next steps.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
git_branchNomain
display_nameNo
git_repo_urlNo
git_auto_pushNo
git_sync_intervalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It lists side effects: creates directory, optionally clones git, runs index, binds session. Notes idempotent. Missing details like synchronous vs async index, but sufficient for transparency.

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

Conciseness4/5

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

Well-structured: summary, side-effects, usage guidance, Args, Returns. Front-loaded with key info. Returns section slightly vague ('Project name, chunk count...') but overall concise and efficient.

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

Completeness5/5

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

Given complexity (6 params, mutation with side effects, output schema exists), the description covers all essential aspects: behavior, all parameters, returns, and distinguishes from siblings. No gaps identified.

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

Parameters5/5

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

Schema has 0% description coverage, so description must compensate. It provides full Args section explaining each parameter: name (short identifier, no spaces), git_repo_url (HTTPS, optional), git_branch (default main), display_name (optional label), git_auto_push (default true), git_sync_interval (default 300s). Adds significant meaning beyond schema titles.

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

Purpose5/5

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

The description clearly states 'Register and initialise a new project in Flaiwheel.' It specifies the verb (register/initialize), resource (project), and scope (new project). It distinguishes from siblings like set_project (switch) and list_projects (list).

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

Usage Guidelines5/5

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

Explicit guidance: 'Call once per project. Use set_project() to switch between already registered projects. Use list_projects() to see what exists.' Also notes idempotency, so safe to call again if exists.

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

timelineA

Return the git history of the document that holds an entity. Read-only.

    Resolves ``entity_id`` to a file via frontmatter ``id:`` field, then
    runs ``git log`` for that file. Use this to answer "what was true at
    time T?" — Git history is the validity window; no separate
    ``valid_from``/``valid_to`` columns are stored.

    Args:
        entity_id: Frontmatter ``id`` value of the entity
        limit: Max commits to return (default 20, max 200)
        project: Target project name (optional)

    Returns:
        Newest-first list of commits with short hash, ISO date, author,
        and subject. Empty result hints if the docs repo is not a git
        checkout or the file has no history.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
projectNo
entity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The description details the read-only nature, the resolution logic, git log execution, return format, and error hints (empty result for non-git checkout). It adds substantial behavioral context beyond annotations (none provided).

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

Conciseness5/5

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

The description is concise with a clear summary, structured Args/Returns sections, and each sentence adds value. No wasted words.

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

Completeness5/5

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

Given the output schema exists, the description covers the return format and error cases. It explains the tool's purpose, parameters, and behavior comprehensively.

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

Parameters4/5

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

Schema coverage is 0%, but the description explains all three parameters: entity_id (frontmatter id), limit (max commits, default 20, max 200), and project (optional). This adds meaning beyond the bare schema.

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

Purpose5/5

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

The description clearly states the tool returns git history for a document, using a specific verb (Return) and resource (git history of the document). It distinguishes from siblings by focusing on historical timeline, unlike search or write tools.

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

Usage Guidelines4/5

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

The description explicitly provides a use case: 'Use this to answer "what was true at time T?"' and explains why git history is used. It does not explicitly mention when not to use or name alternatives, but the context is clear.

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

validate_docA

Validate a markdown document before committing it to the knowledge repo. Read-only.

    Does not write any files or modify the index. Not needed when using
    the write_*() tools — they validate internally. Use this only when
    you are writing raw markdown and committing it manually via git.

    Args:
        content: Full markdown content to validate
        category: Target category — one of: "architecture", "api",
                  "bugfix", "best-practice", "setup", "changelog", "test", "docs"
        project: Target project name (optional)

    Returns:
        "OK" if the document passes all checks, or a list of issues
        tagged [!] critical (blocks indexing), [~] warning, [i] info.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
projectNo
categoryNodocs

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Declares read-only behavior and explicitly states it does not write files or modify the index. This is beyond what annotations (none) provide, giving full transparency.

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

Conciseness4/5

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

Well-structured with a summary line, guidance section, parameter list, and return value. Slightly verbose but every sentence is informative.

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

Completeness5/5

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

Given the tool's complexity and having an output schema, the description covers purpose, usage, parameters, and return values completely. No gaps in essential information.

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

Parameters4/5

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

Despite 0% schema coverage, the description explains all three parameters: content as full markdown, category with a list of valid values, and project as optional name. 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.

Purpose5/5

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

The description clearly states the tool validates a markdown document before committing it to the knowledge repo, distinguishing it from sibling tools like write_* that validate internally. The verb 'validate' and resource 'markdown document' are specific.

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

Usage Guidelines5/5

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

Explicitly states when to use (manual git commit) and when not (when using write_* tools), and names alternatives. This provides clear guidance on tool selection.

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

write_api_docA

Create an API endpoint document, index it, and auto-push to git.

    Side effects: creates api/{slug}.md in the docs path, indexes it into
    the vector store, and pushes to git if configured. Overwrites an
    existing file with the same title.

    Use for HTTP endpoints, REST APIs, and RPC schemas.
    Use write_architecture_doc() for system-level design decisions.
    Use write_best_practice() for API coding conventions.

    Args:
        title: Short title (e.g. "Create User Endpoint")
        endpoint: URL path (e.g. "/api/v1/users")
        method: HTTP method: GET, POST, PUT, PATCH, DELETE, etc.
        request_schema: Request body or query params description
        response_schema: Response body schema and status codes
        auth: Authentication/authorization requirements (optional)
        examples: Curl or code examples (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
authNo
titleYes
methodYes
projectNo
endpointYes
examplesNo
request_schemaYes
response_schemaYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and discloses key side effects: overwrites existing files, indexes into vector store, and auto-pushes to git. It also describes return values. However, it could mention potential failure modes for auto-push or permission requirements, but overall it is transparent given the context.

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

Conciseness5/5

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

The description is structured with clear sections: main purpose, side effects, usage guidelines, parameter list, and returns. It is front-loaded with the most critical information and every sentence adds value with no redundancy.

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

Completeness5/5

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

Given the 8 parameters (5 required) and no annotations, the description provides sufficient context for an agent to select the tool and fill parameters correctly. It covers side effects, alternatives, and return format, and the presence of an output schema further reduces the need to describe return values in detail.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It provides natural-language explanations for all 8 parameters (e.g., 'Short title', 'URL path', 'HTTP method'), adding meaning beyond the schema's type definitions. Though thorough, it could clarify the format for request_schema and response_schema more precisely.

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

Purpose5/5

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

The description clearly states 'Create an API endpoint document, index it, and auto-push to git,' specifying the verb, resource, and actions. It also distinguishes from siblings by naming alternatives: write_architecture_doc for system-level decisions and write_best_practice for API coding conventions.

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

Usage Guidelines5/5

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

Explicitly says 'Use for HTTP endpoints, REST APIs, and RPC schemas' and provides alternatives for other document types, giving clear guidance on when to use this tool versus siblings.

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

write_architecture_docA

Create an architecture decision or system design document, index it, and auto-push.

    Side effects: creates architecture/YYYY-MM-DD-{slug}.md in the docs path,
    indexes it into the vector store, and pushes to git if configured.
    Overwrites an existing file with the same title.

    Use for system design, ADRs, and component relationships.
    Use write_api_doc() for HTTP endpoint specs, write_best_practice()
    for coding patterns, write_bugfix_summary() after fixing bugs.
    Include a Mermaid diagram in the diagrams field for best results.

    Args:
        title: Short title (e.g. "Payment Service Architecture")
        overview: High-level description of the system/component
        decisions: Key architectural decisions made and why
        trade_offs: Alternatives considered and rejected, pros/cons
        components: Optional component breakdown (optional)
        diagrams: Optional Mermaid or ASCII diagrams (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
projectNo
diagramsNo
overviewYes
decisionsYes
componentsNo
trade_offsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Discloses side effects (file creation, indexing, git push, overwrite behavior). Without annotations, this provides substantial transparency, though could mention permission requirements or failure modes.

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

Conciseness4/5

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

Well-structured with summary, bullet-like side effects, usage guidance, and parameter list. Every sentence adds value, though slightly verbose for the parameter descriptions.

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

Completeness4/5

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

Covers all key aspects: purpose, side effects, usage, alternatives, parameters, and return values. Suitable for a complex tool with 7 parameters and missing output schema.

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

Parameters4/5

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

With 0% schema coverage, the description adds value by explaining each parameter's purpose (e.g., 'decisions: Key architectural decisions made and why'). Provides enough context for correct usage, though lacks examples or formats.

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

Purpose5/5

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

Clearly states the tool creates architecture documents, indexes, and auto-pushes. Explicitly differentiates from siblings by naming alternative tools for other doc types.

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

Usage Guidelines5/5

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

Explicitly states when to use (system design, ADRs, component relationships) and when not to use by referencing siblings like write_api_doc, write_best_practice, write_bugfix_summary.

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

write_best_practiceA

Create a coding standard or best practice document, index it, and auto-push.

    Side effects: creates best-practices/{slug}.md in the docs path,
    indexes it into the vector store, and pushes to git if configured.
    Overwrites an existing file with the same title.

    Use for recurring patterns, conventions, and rules the team should follow.
    Use write_architecture_doc() for system-level decisions,
    write_bugfix_summary() after fixing a specific bug.

    Args:
        title: Short title (e.g. "Error Handling in API Routes")
        context: When and where this practice applies
        rule: The actual rule or pattern to follow (be specific)
        rationale: Why this rule exists and what problems it prevents
        examples: Code examples showing correct vs incorrect usage (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
ruleYes
titleYes
contextYes
projectNo
examplesNo
rationaleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries full burden. It discloses side effects (creates file, indexes, pushes to git, overwrites existing). However, it omits details about authorization needs, error handling, or what happens if auto-push fails.

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

Conciseness4/5

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

The description is well-structured with a summary, side effects, usage guidelines, and args list. It is concise but could be slightly tighter (e.g., 'Args:' could be merged with the preceding list). Overall, every sentence adds value.

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

Completeness4/5

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

Given 6 parameters (4 required), the presence of an output schema, and no nested objects, the description covers purpose, side effects, usage, and args. It lacks details on input format specifics (e.g., is markdown expected?) but is otherwise complete for an agent to use the tool effectively.

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

Parameters4/5

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

The schema has no descriptions for any parameters (0% coverage). The description compensates by explaining each parameter in plain English: title, context, rule, rationale, examples, project. This adds semantic meaning beyond the schema's type/title information.

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

Purpose5/5

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

The description uses a specific verb-resource combination: 'Create a coding standard or best practice document, index it, and auto-push.' It clearly identifies the tool's purpose and distinguishes it from sibling tools like write_architecture_doc and write_bugfix_summary.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('Use for recurring patterns, conventions, and rules the team should follow') and provides concrete alternatives for other scenarios ('Use write_architecture_doc() for system-level decisions, write_bugfix_summary() after fixing a specific bug').

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

write_bugfix_summaryA

Create a bugfix summary .md file, index it immediately, and auto-push to git.

    MANDATORY after every bug fix — these summaries are retrieved during
    future debugging sessions to avoid repeating the same mistakes.

    Side effects: creates bugfix-log/YYYY-MM-DD-{slug}.md in the knowledge
    repo docs path, indexes it into the vector store, and pushes to the
    remote git repo if MCP_GIT_REPO_URL is configured. Overwrites an
    existing file if the same title is used on the same day.

    Use write_architecture_doc() for design decisions,
    write_best_practice() for recurring patterns.

    Args:
        title: Short, descriptive title of the bug (used in filename)
        root_cause: What was the actual cause? (be technical)
        solution: How was it fixed? (describe code changes made)
        lesson_learned: What should be done differently next time?
        affected_files: Comma-separated list of changed files (optional)
        tags: Comma-separated categories, e.g. "auth,race-condition,critical" (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
titleYes
projectNo
solutionYes
root_causeYes
affected_filesNo
lesson_learnedYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are not provided, but the description details all side effects: creates file in bugfix-log/, indexes into vector store, pushes to remote git, and overwrites if same title same day. Discloses dependencies on MCP_GIT_REPO_URL. No contradictions.

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

Conciseness4/5

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

The description is front-loaded with the core action and mandatory status. It includes side effects, alternatives, and parameter details. While slightly long, every sentence adds value, so it's efficient.

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

Completeness5/5

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

The tool has 7 parameters (4 required) and no output schema annotations, but the description covers the return format ('Saved filename, chunk count, and whether auto-push succeeded'). Combined with behavioral and usage details, it is fully complete for an agent to invoke correctly.

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

Parameters5/5

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

Schema description coverage is 0%, but the description includes an Args section with meaningful explanations for each parameter (e.g., title used in filename, root_cause: 'be technical', solution: 'describe code changes'). This adds significant value beyond the schema.

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

Purpose5/5

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

The description explicitly states 'Create a bugfix summary .md file, index it immediately, and auto-push to git.' It clearly specifies the verb (create) and resource (bugfix summary file), and differentiates from siblings like write_architecture_doc and write_best_practice.

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

Usage Guidelines5/5

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

The description declares 'MANDATORY after every bug fix' and provides explicit alternatives: 'Use write_architecture_doc() for design decisions, write_best_practice() for recurring patterns.' This gives clear when-to-use and when-not-to-use guidance.

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

write_changelog_entryA

Create a changelog entry for a release, index it, and auto-push to git.

    Side effects: creates changelog/{version-slug}.md in the docs path,
    indexes it into the vector store, and pushes to git if configured.
    Calling twice with the same version overwrites the existing entry.
    Returns an error if none of added/changed/fixed/breaking is provided.

    Use for release notes and version history. At least one of the
    content fields (added, changed, fixed, breaking) must be non-empty.

    Args:
        version: Version string (e.g. "2.1.0" or "v3.9.40")
        release_date: ISO date string (e.g. "2026-05-03")
        added: New features added in this release (optional)
        changed: Changes to existing functionality (optional)
        fixed: Bug fixes included (optional)
        breaking: Breaking changes requiring migration (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
addedNo
fixedNo
changedNo
projectNo
versionYes
breakingNo
release_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully discloses side effects: file creation, vector store indexing, git push, idempotency (overwrites on same version), and error conditions. This provides clear behavioral expectations.

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

Conciseness4/5

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

The description is well-structured with a summary line, bullet points, and arg list. It is concise but contains minor redundancy (error condition mentioned twice). Still, every sentence adds value.

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

Completeness5/5

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

Given the complexity (7 parameters, output schema present), the description covers the tool's purpose, side effects, usage, parameters, and return value format. It is sufficiently complete for an agent to invoke correctly.

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

Parameters5/5

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

Schema coverage is 0%, but the description provides detailed explanations for all 7 parameters, including format examples (e.g., '2.1.0' for version) and semantic meaning of optional content fields. This adds significant value beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'Create a changelog entry for a release, index it, and auto-push to git,' identifying specific resource and actions. It distinguishes from sibling write_* tools by focusing on changelog entries.

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

Usage Guidelines4/5

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

The description explicitly says 'Use for release notes and version history' and specifies the precondition that at least one content field must be provided. However, it does not mention when not to use or compare with alternatives.

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

write_setup_docA

Create a setup, deployment, or infrastructure document, index it, and auto-push.

    Side effects: creates setup/{slug}.md in the docs path, indexes it
    into the vector store, and pushes to git if configured. Overwrites
    an existing file with the same title.

    Use for environment setup guides, CI/CD configuration, Docker or
    infrastructure docs, and deployment runbooks.
    Use write_architecture_doc() for system design rather than how-to guides.

    Args:
        title: Short title (e.g. "Local Development Setup")
        prerequisites: Tools, accounts, or config required before starting
        steps: Step-by-step instructions (numbered list recommended)
        verification: How to confirm the setup is working correctly
        troubleshooting: Common issues and their fixes (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYes
titleYes
projectNo
verificationYes
prerequisitesYes
troubleshootingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description details side effects (creates file, indexes, auto-push) and overwrites existing files. It mentions return values but lacks specifics on permissions or failure modes, which is a minor gap.

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

Conciseness4/5

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

The description is well-structured with headers for side effects, usage, args, and returns. It is slightly long but every sentence adds value; could be slightly more concise.

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

Completeness5/5

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

Given 6 parameters, side effects, return value, and sibling tools, the description covers all essential aspects: purpose, usage, parameter meanings, return format, and relationship to alternatives.

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

Parameters5/5

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

Despite 0% schema description coverage, the description provides an Args section explaining all six parameters (title, prerequisites, steps, verification, troubleshooting, project) with clear roles and format suggestions.

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

Purpose5/5

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

The description clearly states the tool creates a setup, deployment, or infrastructure document, with specific verbs and resource (create, index, auto-push). It distinguishes from sibling write_architecture_doc by naming it directly.

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

Usage Guidelines5/5

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

Explicitly lists use cases (environment setup, CI/CD, Docker, deployment runbooks) and directs to use write_architecture_doc for system design, providing clear when-to-use and when-not-to-use guidance.

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

write_test_caseA

Create a test case document, index it immediately, and auto-push to git.

    Call search_tests() first to check for existing coverage before adding
    a new test case.

    Side effects: creates tests/YYYY-MM-DD-{slug}.md in the docs path,
    indexes it into the vector store, and pushes to git if configured.

    Use after writing or modifying tests to make them discoverable.
    Status values: "pass", "fail", "blocked", "pending" (default: pending).

    Args:
        title: Short test case title (e.g. "User login with expired token")
        scenario: What is being tested and why (the test intent)
        steps: Step-by-step test procedure
        expected_result: What should happen when the test passes
        preconditions: Setup required before running the test (optional)
        actual_result: Observed result if already executed (optional)
        status: "pass", "fail", "blocked", or "pending" (optional)
        tags: Comma-separated tags, e.g. "auth,regression,critical" (optional)
        project: Target project name (optional)

    Returns:
        Saved filename, chunk count, and whether auto-push succeeded.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
stepsYes
titleYes
statusNo
projectNo
scenarioYes
actual_resultNo
preconditionsNo
expected_resultYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Discloses side effects: file creation with specific naming, vector store indexing, and git push. No annotations provided, so description carries full burden; it fully informs the agent of all behavioral impacts.

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

Conciseness4/5

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

Well-structured with sections (purpose, usage, side effects, args, returns), but contains minor redundancy (status values mentioned twice). Still efficient and easy to parse.

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

Completeness5/5

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

Given the tool's complexity (9 parameters, side effects, output), the description fully covers all aspects. Output schema exists and return values are described. No gaps remain.

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

Parameters5/5

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

Schema has 0% description coverage, but the description explains all 9 parameters, including defaults, status enum values, and optional nature. Adds significant meaning beyond schema types/titles.

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

Purpose5/5

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

Clearly states the tool creates a test case document, indexes it, and auto-pushes to git. Distinct from sibling write tools (e.g., write_api_doc) by specifying test case creation and its unique side effects.

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

Usage Guidelines5/5

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

Explicitly advises calling search_tests() first to check coverage, and states the tool should be used after writing or modifying tests. Provides clear when-to-use context and implies alternatives (search_tests).

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

TDQS

A4.5/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose, from codebase analysis to document writing and search. Even similar tools like search_docs, search_bugfixes, and search_by_type are differentiated by scope and description, eliminating ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., analyze_codebase, get_index_stats, write_api_doc). This uniformity makes it easy to predict tool functionality from its name.

Tool Count4/5

30 tools is high but justified by the scope of the server, which covers analysis, search, writing, indexing, and project management. Some tools could potentially be merged (e.g., search_by_type with search_docs), but overall the count is reasonable for the intended functionality.

Completeness4/5

The tool set covers the full knowledge management lifecycle: analysis, classification, writing, indexing, search, and session management. Minor gaps exist, such as the lack of explicit deletion tools for documents or projects, but the core workflow is well-supported.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that transforms codebases into knowledge graphs using Neo4J, enabling AI assistants to understand code structure, relationships, and metrics for more context-aware assistance.
    27
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides advanced document search and processing capabilities through vector stores, including PDF processing, semantic search, web search integration, and file operations. Enables users to create searchable document collections and retrieve relevant information using natural language queries.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Persistent codebase knowledge layer for AI agents. Pre-digests codebases into structured knowledge (symbols, dependency graphs, co-change patterns, architectural decisions) and serves via MCP. 28 languages, 14 tools, ~85% token reduction.
    12
    7
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dl4rce/flaiwheel'

If you have feedback or need assistance with the MCP directory API, please join our Discord server