Semantic, on-demand skill retrieval for Claude Code — replaces the native skill-listing token tax with a vector retriever over full skill descriptions.
skill-search is a semantic search server with 4 well-named tools that follow verb-first conventions. All tools have descriptions (10-200+ chars), which is strong. However, input schemas are partially visible but incomplete: only 2 of 4 tools show explicit parameter type definitions in the provided code sample. The reindex and health tools lack visible schema details. Descriptions are substantive and action-oriented, explaining WHAT and WHEN to use each tool. Error handling is mentioned (health detects drift, reindex fails loud) but recovery guidance in responses is not visible in the code. Naming is clear (search_skills, get_skill, reindex, health) and follows Arcade patterns. Parameter descriptions exist where visible (query, name, force), but the reindex description could clarify parameter constraints better. Output schemas are not documented in the provided code, descriptions mention what tools return (ranked skills, full SKILL.md, warnings) but formal schema documentation is missing. Overall, this is a solid B-/C+ server: good naming and description tone, but incomplete schema visibility and missing output documentation.
Return the full SKILL.md (name + description + body) for a named skill. Used when Claude explicitly selects a skill from search results and needs the complete definition to invoke it.
Diagnose index health — detect drift between disk and the index. The retriever is the sole discovery path once skills are name-only, so a stale/missing index silently hides skills. This surfaces that drift by checking the manifest and comparing disk signature to the last indexed state. Returns warnings + indexed count + disk count.
Rebuild the semantic index of skills. INCREMENTAL by default — only new/changed skills are re-embedded (detected via content hash). Detects deleted skills via manifest. Pass force=True to rebuild from scratch. Fails loud if embedding fails.
Ranked relevant skills via semantic search over full descriptions. The main retrieval path — invoke with a query describing what you need, get back top-k skill names + descriptions + relevance scores.
Output schemas are not documented in tool descriptions. Users/LLMs cannot plan downstream calls or validate responses. search_skills returns {name, description, score} but this is inferred from text, not a formal schema. get_skill returns SKILL.md body but structure is undocumented.
health tool has no visible input schema in the provided code. Input is declared as {} but no formal schema is shown.
reindex force parameter description mentions 'Pass force=True' (Python literal) instead of using formal JSON Schema constraint notation. No enum, min/max, or pattern constraints visible.
Error handling is mentioned conceptually (health.py mentions 'Fails loud if embedding fails', search_skills mentions staleness warnings) but no tool response shows structured error categories (retryable, user-fixable, fatal) or recovery guidance in actual responses.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
Pagination not addressed. search_skills accepts a query but no pagination parameters (limit, offset, page) are visible. Returns top-k results (TOP_K=6 env var) but LLM cannot request fewer/more results or iterate through a larger result set.
search_skills and get_skill descriptions do not include dependency hints. get_skill says 'Used when Claude explicitly selects a skill from search results' but does not state 'Call search_skills first if you don't have a skill name.'