MCP server for Copilot skill discovery, validation, and management
Server has 5 tools with complete input schemas and descriptions. Naming follows verb_noun convention (skills_catalog_*). Descriptions are present (avg 140 chars) but lack actionable context for LLM selection. Parameters are typed but many lack constraints (enums, ranges). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; migrate tool has partial error detection but no recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Composition is sound: each tool has one responsibility, but chaining IDs are not guaranteed in responses.
Search for skills matching a query. Returns ranked results with relevance scores.
Generate a new SKILL.md file from parameters. Creates a skill with template structure.
List all skill domains with counts and categories. Provides overview of skill catalog organization.
Analyze and migrate existing SKILL.md files to the latest schema. Extracts inline triggers, infers tags, adds missing fields. Supports report (dry-run) and apply modes.
Validate skill files against JSON schema. Checks frontmatter structure and required fields.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). Responses are JSON-stringified text blobs without schema hints.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from writes. skills_catalog_generate and skills_catalog_migrate modify state but lack destructiveHint.
Descriptions lack actionable context. 'Search for skills matching a query' does not explain WHEN to call this vs other discovery tools, or what triggers/metadata are searched. Missing dependency hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Parameter 'limit' in skills_catalog_find lacks min/max constraints. Unbounded numeric parameters let LLMs pass absurd values (e.g. limit=999999).
Error handling is minimal. Catch-all returns JSON error but does not categorize as retryable/user-fixable/fatal or provide recovery guidance. migrate tool has partial error detection but no actionable messages.