Two tools with basic schemas and minimal descriptions. Both tools have proper input schemas with types and defaults, but descriptions are generic (10-30 chars) and lack context for LLM selection. No parameter descriptions provided, LLMs cannot infer what 'filter' object controls or when to use pagination. No output schema documented. No error handling guidance. Missing idempotency hints, rate limit info, and dependency documentation. Naming is acceptable (verb_noun pattern) but descriptions fail the 20-char minimum for actionable guidance.
Get a single candidate by their id.
List and filter candidates.
Tool descriptions are under 20 characters and provide no context for LLM selection. 'List and filter candidates' and 'Get a single candidate by their id' lack WHEN to use, WHAT it returns, and prerequisites.
No parameter descriptions. 'filter' object structure is undocumented, LLMs cannot infer that createdAfter/createdBefore are date strings or what format they expect. 'pageSize' and 'page' lack guidance on valid ranges.
No output schema documented. Callers cannot know what fields the Candidate object contains, what types they are, or which IDs/references are available for chaining to other tools.
No error handling guidance. If a candidate ID does not exist or API returns 401/403, the LLM receives no recovery hint (e.g., 'Try search_candidates() first' or 'Check API key scope').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
list_candidates returns raw JSON without pagination metadata. No indication of total count, next_cursor, or whether results are capped. Large result sets risk context window exhaustion.