Give your markdown a lifecycle. Prove which docs are stale with git, pack fresh context for agents, and hand off state between sessions.
kontext demonstrates strong naming conventions (verb_noun pattern: kontext_search, kontext_read, kontext_pack) and comprehensive parameter descriptions. All 7 tools have detailed, LLM-optimized descriptions (100-250 chars) explaining WHAT, WHEN, and WHY. Input schemas are well-structured with proper types, enums, and constraints. However, output schemas are not documented in the visible code, the tool handlers return CallToolResult but the structure of returned data is not formally specified. Error handling is present but generic (fail() function returns title + details without recovery guidance). No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles (6 READ_ONLY, 1 WRITE). Parameter validation is thorough but happens at runtime; no JSON Schema constraints visible for numeric ranges (e.g., limit, budget, days).
Find contradictions and duplicates across the corpus. Returns a list of docs that make competing claims about the same code, or that have the same id — useful for spotting merge conflicts and stale copies before they cause problems.
Prove a doc's freshness from git history. Returns a detailed verdict (fresh/drifting/stale/expired/superseded/orphaned/unverified) backed by commit evidence — the number of commits since the doc was last touched, how many days behind the code it is, which source files have moved, and which globs no longer match anything.
Read the previous session's handoff state. Returns the task, notes, branch, recent commits, and which docs were relevant — everything needed to pick up where the last agent left off.
Freeze the current working state into a handoff doc. Captures the branch, uncommitted changes, recent commits, and which docs cover the touched code — so the next agent can pick up without context loss. Handoffs expire after 7 days.
Pack ranked, budgeted context for a task. Searches the corpus for relevant docs, ranks them by relevance and freshness, and returns a bundle that fits a token budget — with every withheld section named and its reason given.
Output schemas not documented. Tool handlers return CallToolResult but the structure of returned data (fields, types, pagination) is not formally specified. LLMs cannot plan downstream calls or extract data reliably without knowing response shape.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk profiles. kontext_handoff_write is destructive (WRITE risk); 6 tools are READ_ONLY. Annotations enable agents to reason about safety and retry logic.
Numeric parameters lack JSON Schema constraints (min/max). 'limit' (default 20, 50), 'budget' (default 8000), and 'days' (7-day TTL) have no declared ranges. LLMs may pass invalid values (negative, zero, absurdly large).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Read one doc in full. Returns the complete markdown with its freshness verdict, staleness evidence, and a list of any sections withheld for being too stale — nothing is ever dropped silently.
Find docs by keyword, kind, owner, or glob. Returns a ranked list of matches with freshness verdicts and token estimates — cheap discovery before you commit to reading a full doc.
Error handling is generic. fail() returns title + detail array but does not categorize errors as retryable/user-fixable/fatal or provide recovery guidance. E.g., 'path not found' should suggest search_docs() or list available paths.
kontext_conflicts has minimal input schema (only 'limit' parameter). No description of what 'conflicts' means (contradictions? duplicates? both?). Output structure unknown, does it return doc pairs, claim summaries, or raw diffs?