Cloudchampionmcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Cloudchampionmcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Servidor MCP (Model Context Protocol) para consultar el catálogo de formación de Cloud Champion (cloudchampion.es y variantes por país).
Expone herramientas que permiten a agentes de IA buscar, filtrar y obtener estadísticas sobre webinars, vídeos, learning paths, podcasts y otros recursos de Microsoft para partners.
Agente IA ──► MCP Server (FastMCP) ──► API Cloud Champion
│ /wp-json/feed/content
│
└── Caché en memoria (TTL configurable)GET https://www.cloudchampion.es/wp-json/feed/content — catálogo global público (todos los países/idiomas)| Tool | Descripción |
|---|---|
buscar_formacion | Búsqueda textual + filtros combinables (país, idioma, tipo, audiencia, área, provider, fechas) |
listar_proximas_formaciones | Formaciones futuras en una ventana de N días |
detalle_formacion | Detalle completo de una formación por título parcial o ID |
listar_filtros_disponibles | Valores únicos disponibles para cada filtro (tipos, áreas, idiomas, etc.) |
estadisticas_catalogo | Estadísticas del catálogo: totales por tipo, área, audiencia, provider, rango de fechas |
# Clonar el repositorio
git clone <repo-url>
cd cloudchampion-mcp
# Instalar dependencias
pip install -r requirements.txt
# (Opcional) Copiar y ajustar variables de entorno
cp .env.example .envfastmcp dev src/mcp_cloudchampion/server.pyEsto abre el inspector web de FastMCP donde puedes probar las tools interactivamente.
MCP_TRANSPORT=stdio python -m mcp_cloudchampion.serverpython -m mcp_cloudchampion.server
# Servidor en http://0.0.0.0:8000docker build -t mcp-cloudchampion .docker run -p 8000:8000 mcp-cloudchampiondocker run -p 8000:8000 \
-e CACHE_TTL_SECONDS=300 \
-e LOG_LEVEL=DEBUG \
mcp-cloudchampionLa infraestructura se define como IaC con Bicep en la carpeta infra/.
RESOURCE_GROUP="rg-cloudchampion-mcp"
LOCATION="westeurope"
# Crear Resource Group
az group create --name $RESOURCE_GROUP --location $LOCATION
# Desplegar infraestructura (ACR + Log Analytics + Container Apps Env + Container App)
az deployment group create \
--resource-group $RESOURCE_GROUP \
--template-file infra/main.bicep \
--parameters infra/main.parameters.json
# Ver outputs (FQDN, MCP endpoint, ACR login server)
az deployment group show \
--resource-group $RESOURCE_GROUP \
--name main \
--query 'properties.outputs' -o jsonRecursos creados:
ACR_NAME="acrcloudchampionmcp"
ACA_APP="mcp-cloudchampion"
# Build imagen en ACR
az acr build --registry $ACR_NAME --image mcp-cloudchampion:latest .
# Actualizar Container App con la nueva imagen
az containerapp update \
--name $ACA_APP \
--resource-group $RESOURCE_GROUP \
--image "$ACR_NAME.azurecr.io/mcp-cloudchampion:latest"az containerapp show --name $ACA_APP --resource-group $RESOURCE_GROUP \
--query "properties.configuration.ingress.fqdn" -o tsvEdita infra/main.parameters.json para cambiar el nombre del ACR, CPU, memoria, réplicas, etc. Parámetros disponibles:
| Parámetro | Descripción | Default |
|---|---|---|
acrName | Nombre del ACR (globalmente único) | acrcloudchampionmcp |
environmentName | Nombre del Container Apps Environment | env-cloudchampion-mcp |
appName | Nombre de la Container App | mcp-cloudchampion |
minReplicas | Mín. réplicas (0 = scale to zero) | 0 |
maxReplicas | Máx. réplicas | 3 |
cpu | CPU asignada | 0.25 |
memory | Memoria asignada | 0.5Gi |
cacheTtlSeconds | TTL de caché del feed | 600 |
logLevel | Nivel de logging | INFO |
El workflow de GitHub Actions (.github/workflows/deploy.yml) tiene dos jobs:
infra/ o se lanza manualmente con deploy_infra: true)main)Requiere el secret AZURE_CREDENTIALS configurado en el repo.
{
"mcpServers": {
"cloudchampion": {
"url": "https://<tu-aca-url>.azurecontainerapps.io/mcp"
}
}
}from agents import Agent
from agents.mcp import MCPServerStreamableHttp
mcp = MCPServerStreamableHttp(url="https://<tu-aca-url>.azurecontainerapps.io/mcp")
agent = Agent(
name="CloudChampionAssistant",
instructions="Eres un asistente experto en formación de Cloud Champion...",
mcp_servers=[mcp],
)| Variable | Descripción | Default |
|---|---|---|
CLOUDCHAMPION_FEED_URL | URL del feed de contenido | https://www.cloudchampion.es/wp-json/feed/content |
CACHE_TTL_SECONDS | TTL de la caché en segundos | 600 |
MCP_TRANSPORT | Transporte: streamable-http, sse, stdio | streamable-http |
MCP_HOST | Host de escucha | 0.0.0.0 |
MCP_PORT | Puerto de escucha | 8000 |
LOG_LEVEL | Nivel de logging | INFO |
├── src/
│ └── mcp_cloudchampion/
│ ├── __init__.py # Versión del paquete
│ ├── __main__.py # python -m entry point
│ ├── config.py # Settings + logging setup
│ ├── text_utils.py # Normalización de texto / fuzzy match
│ ├── feed_client.py # Cliente HTTP + caché con TTL
│ ├── filters.py # Motor de filtrado
│ └── server.py # FastMCP server + 5 tools
├── Dockerfile # Multi-stage build
├── .dockerignore
├── .env.example
├── pyproject.toml
├── requirements.txt
├── README.md
└── .github/workflows/
└── deploy.yml # CI/CD → Azure Container AppsMIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.