Skip to main content
Glama

list_skills

View all available skills with their descriptions, sources, and document counts to explore capabilities or troubleshoot skill availability.

Instructions

Returns a complete inventory of all loaded skills with their names, descriptions, sources, and document counts. Use this for exploration or debugging to see what skills are available. NOTE: For finding relevant skills for a specific task, use the 'search_skills' tool instead - it performs semantic search to find the most appropriate skills for your needs.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • Primary handler function _handle_list_skills for the MCP stdio server class SkillsMCPServer. Lists all loaded skills with name, description, source (formatted), and document count. Handles loading state.
    async def _handle_list_skills(self, arguments: dict[str, Any]) -> list[TextContent]:
        """Handle list_skills tool calls.
    
        Parameters
        ----------
        arguments : dict[str, Any]
            Tool arguments (empty for list_skills).
    
        Returns
        -------
        list[TextContent]
            Complete list of all skills with metadata.
        """
        response_parts = []
    
        # Add loading status if skills are still being loaded
        status_msg = self.loading_state.get_status_message()
        if status_msg:
            response_parts.append(status_msg)
    
        if not self.search_engine.skills:
            if not self.loading_state.is_complete:
                return [
                    TextContent(
                        type="text",
                        text=status_msg
                        or "" + "No skills loaded yet. Please wait for skills to load.",
                    )
                ]
            return [TextContent(type="text", text="No skills currently loaded.")]
    
        response_parts.extend(
            [
                f"Total skills loaded: {len(self.search_engine.skills)}\n",
                "=" * 80,
                "\n",
            ]
        )
    
        for i, skill in enumerate(self.search_engine.skills, 1):
            # Format source as owner/repo for GitHub URLs
            import re
    
            source = skill.source
            if "github.com" in source:
                # Extract owner/repo from GitHub URL
                match = re.search(r"github\.com/([^/]+/[^/]+)", source)
                if match:
                    source = match.group(1)
    
            doc_count = len(skill.documents)
    
            response_parts.append(f"{i}. {skill.name}")
            response_parts.append(f"   Description: {skill.description}")
            response_parts.append(f"   Source: {source}")
            response_parts.append(f"   Documents: {doc_count} file(s)")
            response_parts.append("")
    
        return [TextContent(type="text", text="\n".join(response_parts))]
  • Standalone handler function handle_list_skills used by the HTTP server. Identical logic to _handle_list_skills but without self references.
    async def handle_list_skills(
        arguments: dict[str, Any], search_engine, loading_state
    ) -> list[TextContent]:
        """Handle list_skills tool calls (standalone version for HTTP server)."""
        import re
    
        response_parts = []
    
        # Add loading status if skills are still being loaded
        status_msg = loading_state.get_status_message() if loading_state else None
        if status_msg:
            response_parts.append(status_msg)
    
        if not search_engine.skills:
            if loading_state and not loading_state.is_complete:
                return [
                    TextContent(
                        type="text",
                        text=(status_msg or "")
                        + "No skills loaded yet. Please wait for skills to load.",
                    )
                ]
            return [TextContent(type="text", text="No skills currently loaded.")]
    
        response_parts.extend(
            [
                f"Total skills loaded: {len(search_engine.skills)}\n",
                "=" * 80,
                "\n",
            ]
        )
    
        for i, skill in enumerate(search_engine.skills, 1):
            # Format source as owner/repo for GitHub URLs
            source = skill.source
            if "github.com" in source:
                # Extract owner/repo from GitHub URL
                match = re.search(r"github\.com/([^/]+/[^/]+)", source)
                if match:
                    source = match.group(1)
    
            doc_count = len(skill.documents)
    
            response_parts.append(f"{i}. {skill.name}")
            response_parts.append(f"   Description: {skill.description}")
            response_parts.append(f"   Source: {source}")
            response_parts.append(f"   Documents: {doc_count} file(s)")
            response_parts.append("")
    
        return [TextContent(type="text", text="\n".join(response_parts))]
  • FastMCP tool registration for list_skills in the HTTP server, including schema (empty input), title, description, and wrapper that delegates to handle_list_skills.
    @mcp.tool(
        name="list_skills",
        title="List available skills",
        description=(
            "Returns the full inventory of loaded skills (names, descriptions, sources, document counts) "
            "for exploration or debugging. For task-driven work, prefer calling 'find_helpful_skills' first "
            "to locate the most relevant option before reading documents."
        )
    )
    async def list_skills() -> list[TextContent]:
        """List all loaded skills."""
        return await handle_list_skills({}, search_engine, loading_state_global)
  • Stdio MCP server tool registration in list_tools() and dispatch in call_tool() for list_skills, including schema and handler invocation.
    @self.server.list_tools()
    async def list_tools() -> list[Tool]:
        """List available tools."""
        return [
            Tool(
                name="find_helpful_skills",
                title="Find the most helpful skill for any task",
                description=(
                    "Always call this tool FIRST whenever the question requires any domain-specific knowledge "
                    "beyond common sense or simple recall. Use it at task start, regardless of the task and whether "
                    "you are sure about the task, It performs semantic search over a curated library of proven skills "
                    "and returns ranked candidates with step-by-step guidance and best practices. Do this before any "
                    "searches, coding, or any other actions as this will inform you about the best approach to take."
                ),
                inputSchema={
                    "type": "object",
                    "properties": {
                        "task_description": {
                            "type": "string",
                            "description": (
                                "Description of the task you want to accomplish. Be specific about your goal, "
                                "context, or problem domain for better results (e.g., 'debug Python API errors', "
                                "'process genomic data', 'build React dashboard')"
                            ),
                        },
                        "top_k": {
                            "type": "integer",
                            "description": f"Number of skills to return (default: {self.default_top_k}). Higher values provide more options but may include less relevant results.",
                            "default": self.default_top_k,
                            "minimum": 1,
                            "maximum": 20,
                        },
                        "list_documents": {
                            "type": "boolean",
                            "description": "Include a list of available documents (scripts, references, assets) for each skill (default: True)",
                            "default": True,
                        },
                    },
                    "required": ["task_description"],
                },
            ),
            Tool(
                name="read_skill_document",
                title="Open skill documents and assets",
                description=(
                    "Use after finding a relevant skill to retrieve specific documents (scripts, references, assets). "
                    "Supports pattern matching (e.g., 'scripts/*.py') to fetch multiple files. Returns text content or URLs "
                    "and never executes code. Prefer pulling only the files you need to complete the current step."
                ),
                inputSchema={
                    "type": "object",
                    "properties": {
                        "skill_name": {
                            "type": "string",
                            "description": "Name of the skill (as returned by find_helpful_skills)",
                        },
                        "document_path": {
                            "type": "string",
                            "description": (
                                "Path or pattern to match documents. Examples: 'scripts/example.py', "
                                "'scripts/*.py', 'references/*', 'assets/diagram.png'. "
                                "If not provided, returns a list of all available documents."
                            ),
                        },
                        "include_base64": {
                            "type": "boolean",
                            "description": (
                                "For images: if True, return base64-encoded content; if False, return only URL. "
                                "Default: False (URL only for efficiency)"
                            ),
                            "default": False,
                        },
                    },
                    "required": ["skill_name"],
                },
            ),
            Tool(
                name="list_skills",
                title="List available skills",
                description=(
                    "Returns the full inventory of loaded skills (names, descriptions, sources, document counts) "
                    "for exploration or debugging. For task-driven work, prefer calling 'find_helpful_skills' first "
                    "to locate the most relevant option before reading documents."
                ),
                inputSchema={
                    "type": "object",
                    "properties": {},
                    "required": [],
                },
            ),
        ]
    
    @self.server.call_tool()
    async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent]:
        """Handle tool calls."""
        if name == "find_helpful_skills":
            return await self._handle_search_skills(arguments)
        elif name == "read_skill_document":
            return await self._handle_read_skill_document(arguments)
        elif name == "list_skills":
            return await self._handle_list_skills(arguments)
        else:
            raise ValueError(f"Unknown tool: {name}")
  • Tool schema definition for list_skills with empty input schema (no parameters required).
    Tool(
        name="list_skills",
        title="List available skills",
        description=(
            "Returns the full inventory of loaded skills (names, descriptions, sources, document counts) "
            "for exploration or debugging. For task-driven work, prefer calling 'find_helpful_skills' first "
            "to locate the most relevant option before reading documents."
        ),
        inputSchema={
            "type": "object",
            "properties": {},
            "required": [],
        },
    ),
Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/OrionLi545/claude-skills-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server