Kagi Search server has 2 tools with explicit registration and visible schemas. However, the server exhibits significant quality gaps: parameter descriptions are minimal (10-15 chars, well below the 72-char baseline); output schemas are undocumented (search() returns list[dict] but no field structure is specified); error handling is basic (ValueError raised but no recovery guidance); no input validation or constraint documentation; authenticate() exposes a security risk by accepting a token parameter (violates secret-injection pattern). The descriptions themselves are adequate (40-65 chars, within range) but lack WHEN/WHY context needed for LLM selection. Overall, this is a mediocre community server, functional but unsuitable for production use without substantial rework.
Authenticate with Kagi and save cookies for future searches.
Search Kagi using saved authentication cookies.
SECURITY: authenticate() accepts 'token' as a parameter. Credentials must never appear as tool parameters; use server-side secret injection via environment variables or secure vault. Agent traces log every parameter, secrets in params leak into logs and prompt history.
OUTPUT SCHEMA UNDOCUMENTED: search() returns list[dict] with fields 'rank', 'title', 'url', 'snippet', but this structure is not formally documented in a schema. LLM cannot plan downstream calls or extract fields reliably without knowing the exact output structure. Must provide explicit JSON Schema for return type.
PARAMETER DESCRIPTIONS TOO BRIEF: 'token' (27 chars), 'query' (15 chars), 'max_results' (40 chars). Baseline for parameter descriptions is 72 chars. These lack context about format, constraints, and valid values. 'token' should explain where to find it; 'query' should give examples or constraints; 'max_results' should state min/max bounds (1-100?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 39 | - | v1 |
NO INPUT VALIDATION CONSTRAINTS: max_results defaults to 10 but no bounds specified. Can LLM pass 999999? No enum or min/max on 'query'. No regex pattern validation. authenticate() lacks format hints for the token parameter.
ERROR HANDLING LACKS RECOVERY GUIDANCE: search() raises ValueError('Not authenticated! ...') but does not tell the LLM HOW to recover or WHAT to try next. The error message is user-friendly but not LLM-actionable. Should specify 'Call authenticate() first with your Kagi token' as a next step.
MISSING DEPENDENCY DOCUMENTATION: search() requires authenticate() to have been called first (cookies must exist). This prerequisite is noted in server instructions but not in the search() description. The tool should state: 'Requires prior call to authenticate(). If cookies not found, authenticate() must be invoked first.'
NO PAGINATION SUPPORT: search() returns up to max_results items but no cursor, offset, or has_more indicator. If LLM needs more results, it must re-run the search. Tools returning lists should support cursor-based or limit/offset pagination.