Skills MCP Server

Skills MCP Server

Centralized, sandboxed MCP server to manage, execute, and expose advanced Agent Skills to any MCP-capable framework or low-code platform.

Category
Visit Server

README

๐Ÿ› ๏ธ Skills MCP Server

Python FastAPI MCP Agno

A centralized, sandboxed Model Context Protocol (MCP) server designed to manage, execute, and expose advanced Agent Skills to any MCP-capable framework or low-code platform (like n8n, custom agents, etc.).

๐Ÿ’ก The Problem It Solves

Currently, many popular orchestration frameworks and low-code platforms only support basic tools or MCP. However, modern AI agents require fully encapsulated, complex agent skills (prompts, tool chains, and logic combined). Agno framework natively supports these advanced agent skills, but getting them into platforms like n8n or custom agentic systems has historically been a challenge.

skills_mcp_server is the bridge. By wrapping Agno skills in an isolated FastAPI server and exposing them via the universal Model Context Protocol (MCP), any system that supports MCP can now instantly leverage complex agent skills.


โœจ Key Advantages

  • ๐ŸŽฏ Selective Skill Exposure (Context Optimization): Install a massive library of skills on the server, but expose only the exact ones a specific agent needs. By tailoring the skill list per agent, you prevent LLM context bloat, save tokens, and drastically improve agent accuracy.
  • ๐Ÿ—„๏ธ Centralized Skill Hub: Stop scattering custom scripts and functions across different repositories or n8n nodes. Manage your entire organization's AI capabilities in one unified, easily updatable server.
  • ๐Ÿ”’ Sandboxed Execution: All skills run in an isolated environment. You can safely install third-party community skills without risking the integrity of your host application or primary infrastructure.
  • ๐Ÿ“ฆ Automatic Dependency Isolation: Skills that include a requirements.txt file are automatically provisioned with a dedicated virtual environment using uv. This ensures perfect isolation and clean uninstalls without bloating the main server's dependencies.
  • ๐Ÿง  Powered by Agno: Go beyond simple tools. Leverage Agno to build rich, stateful agent skills that can handle complex multi-step reasoning before returning the final payload via MCP.
  • ๐Ÿ“ฆ Dynamic Hot-Loading: Add, update, or remove skills on the fly using .zip files, custom .skill packages, or direct download URLs without ever restarting the server.

๐Ÿ—๏ธ Architecture Concept

The system operates on a dual-interface architecture:

  1. REST API (The Manager): A control plane to dynamically install, update, list, and delete skills. It acts as your private skill store.
  2. MCP Server (The Provider): The execution plane that securely exposes the curated list of skills to your MCP-capable agents (n8n, Cursor, Claude Desktop, etc.).

๐Ÿš€ Requirements

  • uv (Extremely fast Python package installer and resolver)
  • Python 3.12+
  • FastAPI
  • FastMCP
  • Agno

๐Ÿ› ๏ธ Installation & Setup

  1. Clone the repository:

    git clone [https://github.com/chameleonbr/skills_mcp_server.git](https://github.com/chameleonbr/skills_mcp_server.git)
    cd skills_mcp_server
    
    
  2. Configure environment:

    cp env.example .env
    # Edit .env and set API_KEY and SKILLS_DIR
    
  3. Install dependencies:

    uv sync
    
  4. Run the server:

    uv run uvicorn main:app --reload
    

Docker

docker-compose up --build

๐Ÿงช Running Tests

The project includes a comprehensive unit test suite covering models, routes, services, and the MCP server.

To run the tests, ensure you have the development dependencies installed, and then use pytest:

uv run pytest -v tests/

To run tests with coverage reporting:

uv run pytest --cov=. tests/

๐Ÿ—‚๏ธ Project Structure

skills_mcp_server/
โ”œโ”€โ”€ main.py          # FastAPI app + FastMCP mount + lifespan
โ”œโ”€โ”€ routes.py        # REST API routes (/skills)
โ”œโ”€โ”€ services.py      # SkillManager (install, delete, reload, GitHub support)
โ”œโ”€โ”€ mcp_server.py    # FastMCP server with Agno skill tools
โ”œโ”€โ”€ models.py        # Pydantic request/response schemas
โ”œโ”€โ”€ s3_skills.py     # S3Skills loader (sync from S3 bucket โ†’ LocalSkills)
โ”œโ”€โ”€ skills/          # Skill folders (each must contain SKILL.md)
โ”œโ”€โ”€ pyproject.toml
โ””โ”€โ”€ Dockerfile / docker-compose.yml

๐Ÿ”‘ Authentication

All /skills routes require an X-API-Key header:

-H "X-API-Key: your_api_key"

Set API_KEY in your .env file.


๐Ÿ“ก REST API โ€” Control Plane

Interactive docs available at http://localhost:8000/docs.

Skills Management

Method Route Description
GET /skills List all loaded skills
GET /skills/{name} Get full details of a skill
POST /skills Install a skill from URL or base64 zip
POST /skills/upload Install skill(s) via file upload
DELETE /skills/{name} Delete a skill
DELETE /skills Delete all skills
GET /skills/prompt_snippet Get system prompt snippet for agents (supports ?skill_list=skill1,skill2 and ?prompt_enforcement=false)
POST /skills/prompt_snippet Inject prompt snippet into the passed JSON payload (supports ?skill_list=... and ?prompt_enforcement=false)

Health Check

GET /health

Returns 200 OK with the number of currently loaded skills.


๐Ÿ“ฅ Installing Skills

Note: You no longer need to provide a name. The server will automatically extract the skill name from the SKILL.md file inside the archive. If your folder or URL contains multiple skills, they will all be installed automatically.

1. File Upload (multipart)

curl -X POST http://localhost:8000/skills/upload \
  -H "X-API-Key: your_api_key" \
  -F "file=@my_skill.skill" \
  -F "overwrite=true" # optional, defaults to false

2. URL (direct zip download)

curl -X POST "http://localhost:8000/skills" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/my_skill.zip", "overwrite": true}'

3. Agent Skills Discovery RFC (Index JSON) ๐Ÿ“–

Install multiple skills curated in a skills_index.json file as defined by the Cloudflare Discovery RFC:

curl -X POST "http://localhost:8000/skills" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://raw.githubusercontent.com/LambdaTest/agent-skills/refs/heads/main/skills_index.json", "overwrite": true}'

3. GitHub URL ๐Ÿ™

You can point directly to a GitHub repository or a subdirectory inside one:

# Entire repository (uses main branch)
curl -X POST "http://localhost:8000/skills" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://github.com/owner/repo"}'

# Specific branch
curl -X POST "http://localhost:8000/skills" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://github.com/owner/repo/tree/develop"}'

# Specific subfolder inside a repo
curl -X POST "http://localhost:8000/skills" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://github.com/anthropics/skills/tree/main/skills/skill-creator"}'

4. Base64 Zip

curl -X POST "http://localhost:8000/skills" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d "{\"zip_base64\": \"$(base64 -w0 my_skill.zip)\", \"overwrite\": true}"

๐Ÿค– MCP Server โ€” Provider Plane

The MCP server is mounted at /mcp using the StreamableHTTP transport.

MCP Endpoint

Transport URL
StreamableHTTP POST /mcp
SSE GET /mcp/sse

MCP Configuration (Claude Desktop / any MCP client)

{
  "mcpServers": {
    "skills": {
      "url": "http://localhost:8000/mcp",
      "headers": {
        "X-API-Key": "your_api_key"
      }
    }
  }
}

Available MCP Tools

Tool Description
get_available_skills() List all loaded skills with name and description
get_skill_instructions(skill_name) Load full instructions for a skill
get_skill_reference(skill_name, reference_path) Read a reference document from a skill
get_skill_script(skill_name, script_path, execute) Read or execute a script from a skill

Agent System Prompt Integration

To inject skill awareness into any agent, retrieve the pre-built prompt snippet. You can optionally pass skill_list to only include specific skills by name. By default, a strict prompt enforcement string is prepended to ensure agents use tools exactly as instructed, which can be disabled via prompt_enforcement=false. The prompt enforcement string is regularly refined for optimal formatting and context efficiency.

# Get snippet containing ALL installed skills (includes prompt enforcement by default)
curl -X GET http://localhost:8000/skills/prompt_snippet \
  -H "X-API-Key: your_api_key"

# Get snippet without the prompt enforcement rules
curl -X GET "http://localhost:8000/skills/prompt_snippet?prompt_enforcement=false" \
  -H "X-API-Key: your_api_key"

# Get snippet filtered to specific skills
curl -X GET "http://localhost:8000/skills/prompt_snippet?skill_list=web_browsing,yahoo_finance" \
  -H "X-API-Key: your_api_key"

Paste the returned XML snippet into your agent's system_prompt. It describes the loaded skills and how to use the MCP tools to access them.

Low-Code Integration (n8n, Make, Custom Apps)

To simplify integrations in platforms where manipulating strings is hard, use the POST endpoint sending the payload as JSON and receiving the same payload with the prompt with the additional system instructions that you need to append to the system prompt of your agent:

curl -X POST "http://localhost:8000/skills/prompt_snippet" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"messages": [{"role": "user", "content": "Help me"}], "temperature": 0.7}'

Returns the original payload with "prompt" dynamically appended/overwritten with the system instructions:

{
  "messages": [{"role": "user", "content": "Help me"}],
  "temperature": 0.7,
  "prompt": "<skills_system>...</skills_system>"
}

๐Ÿ“‚ Skill Structure

Each skill is a folder inside SKILLS_DIR with the following layout:

my_skill/
โ”œโ”€โ”€ SKILL.md         # Required: frontmatter (name, description) + instructions
โ”œโ”€โ”€ scripts/         # Optional: executable script files
โ”‚   โ””โ”€โ”€ run.py
โ””โ”€โ”€ references/      # Optional: documentation files
    โ””โ”€โ”€ guide.md

SKILL.md example:

---
name: yahoo_finance
description: Fetch stock quotes and financial data from Yahoo Finance.
---

## Instructions

Use this skill when the user asks about stock prices or financial data...

โš™๏ธ Environment Variables

Core

Variable Default Description
API_KEY (required) Secret key for REST API and MCP authentication
SKILLS_DIR skills Local directory for skill folders (used by local backend)
SKILLS_STORAGE local Storage backend: local or s3
ALLOW_RUN_SCRIPTS false Whether to allow script execution via mcp_get_script
LAZY_INSTALL_VENVS false If true, defers requirements.txt generation/installation to the first time a script is executed. If false, installs dependencies immediately upon skill installation.
ALLOW_GET_AVAILABLE_SKILLS true Exposes the get_available_skills tool globally via FastMCP. Set to false to hide discovery mechanisms via tool calls.

Detailed Explanation of Core Variables

  • API_KEY: This is the master secret used to secure both the REST API endpoints and the FastMCP transport connection. It is mandatory for any operation.
  • SKILLS_DIR: Defines the path (relative to the app root or absolute) where the skill folders are maintained. Defaults to skills in the local backend.
  • SKILLS_STORAGE: Determines the strategy for loading skills. It can be set to local (reads from SKILLS_DIR) or s3 (syncs skills from an AWS S3-compatible object storage).
  • ALLOW_RUN_SCRIPTS: A security toggle. If set to false (default), the get_skill_script tool with execute=True will be rejected by the application. Setting it to true allows agents to effectively run python scripts defined by skills.
  • LAZY_INSTALL_VENVS: Performance toggle. If false (default), the server blocks during skill installation to build the Python Virtual Environment and install the requirements.txt. If true, the installation is instantaneous, but the runtime will pause to install the .venv only when a script from the skill is executed for the first time.
  • ALLOW_GET_AVAILABLE_SKILLS: Integration toggle. If true (default), the get_available_skills tool is exposed globally via FastMCP for dynamic discovery. If false, the tool is hidden, requiring the system prompt to explicitly define the skills or using the /skills/prompt_snippet REST endpoint for injection, this is useful to avoid the LLM to discover skills that are not meant to be used, requiring the developer to explicitly define the skills in the system prompt, injecting the snippet.

S3 Storage (SKILLS_STORAGE=s3)

Variable Default Description
S3_BUCKET (required) S3 bucket name
S3_PREFIX skills/ Key prefix acting as the remote skills root
S3_CACHE_DIR .s3cache Local directory where S3 files are cached
AWS_ACCESS_KEY_ID โ€” AWS access key (or use IAM role / ~/.aws/credentials)
AWS_SECRET_ACCESS_KEY โ€” AWS secret key
AWS_DEFAULT_REGION us-east-1 AWS region
AWS_ENDPOINT_URL โ€” Custom endpoint for MinIO / LocalStack

โ˜๏ธ Storage Backends

Local (default)

Skills are loaded from the SKILLS_DIR folder on disk. With Docker, a named volume (skills_data) is used for persistence:

# .env
SKILLS_STORAGE=local
SKILLS_DIR=skills

The docker-compose.yml mounts skills_data:/app/skills automatically โ€” skills survive docker-compose down / up cycles.

S3 / S3-compatible

Skills are synced from an S3 bucket to a local cache dir on every reload(). The S3Skills loader (s3_skills.py) follows the same SkillLoader interface as Agno's LocalSkills.

# .env
SKILLS_STORAGE=s3
S3_BUCKET=my-bucket
S3_PREFIX=skills/
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_DEFAULT_REGION=us-east-1

# MinIO / LocalStack:
# AWS_ENDPOINT_URL=http://localhost:9000

Expected bucket layout:

my-bucket/
โ””โ”€โ”€ skills/
    โ”œโ”€โ”€ my_skill/
    โ”‚   โ”œโ”€โ”€ SKILL.md
    โ”‚   โ”œโ”€โ”€ scripts/run.py
    โ”‚   โ””โ”€โ”€ references/guide.md
    โ””โ”€โ”€ another_skill/
        โ””โ”€โ”€ SKILL.md

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured