list_skills
Discover all available skills installed in the Skill Management MCP Server by listing their names, descriptions, and validation status from SKILL.md metadata.
Instructions
List all available skills in the ~/.skill-mcp/skills directory with their descriptions parsed from SKILL.md frontmatter.
This tool returns a lightweight overview of all installed skills, including:
Skill name and directory path
Description extracted from SKILL.md YAML frontmatter
Validation status (whether SKILL.md exists)
Use this tool first to discover what skills are available before working with specific skills. Each skill is a self-contained directory that may contain scripts, data files, and a SKILL.md metadata file.
Returns: List of all available skills with names, paths, and descriptions.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- The main handler function that executes the list_skills tool logic by scanning the skills directory and collecting summaries for each skill directory.def list_skills() -> list[SkillSummary]: """ List all available skills with descriptions. Returns: List of SkillSummary objects """ skills: list[SkillSummary] = [] if not SKILLS_DIR.exists(): return skills for item in sorted(SKILLS_DIR.iterdir()): if item.is_dir(): skill_summary = SkillService._get_skill_summary(item.name) if skill_summary: skills.append(skill_summary) return skills
- src/skill_mcp/models.py:10-13 (schema)Input schema (Pydantic model) for the list_skills tool, which requires no parameters.class ListSkillsInput(BaseModel): """Input for listing all skills.""" pass
- Helper function in skill_crud tool that handles the list operation by calling SkillService.list_skills() and formatting the output.async def _handle_list(input_data: SkillCrudInput) -> list[types.TextContent]: """Handle list operation.""" all_skills = SkillService.list_skills() # Apply search filter if provided skills = all_skills if input_data.search: import re skills = [ s for s in all_skills if ( input_data.search.lower() in s.name.lower() or input_data.search.lower() in (s.description or "").lower() or ( re.search(input_data.search, s.name, re.IGNORECASE) if input_data.search.startswith("^") or "*" in input_data.search else False ) ) ] if not skills: result = "No skills found in ~/.skill-mcp/skills" if input_data.search: result += f" matching '{input_data.search}'" else: result = f"Found {len(skills)} skill(s)" if input_data.search: result += f" matching '{input_data.search}'" result += ":\n\n" for skill in skills: status = "✓" if skill.has_skill_md else "✗" result += f"{status} {skill.name}\n" if skill.description: result += f" Description: {skill.description}\n" result += "\n" return [types.TextContent(type="text", text=result)]
- Supporting helper function used by list_skills to generate summary for individual skills from their SKILL.md files.def _get_skill_summary(skill_name: str) -> SkillSummary | None: """Get a summary of a single skill.""" skill_dir = SKILLS_DIR / skill_name if not skill_dir.is_dir(): return None skill_md_path = skill_dir / SKILL_METADATA_FILE has_skill_md = skill_md_path.exists() description = "" if has_skill_md: try: content = skill_md_path.read_text() metadata = parse_yaml_frontmatter(content) description = get_skill_description(metadata) except Exception: pass return SkillSummary( name=skill_name, description=description, has_skill_md=has_skill_md, )