Cost Optimizer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Cost Optimizer (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 para analizar costes y uso de AWS a traves de la API de AWS Cost Explorer, disenado para despliegues en EKS con Pod Identity y asuncion de roles multi-cuenta.
Este servidor esta disenado para ejecutarse en EKS, donde el pod obtiene credenciales via EKS Pod Identity, y para cada peticion asume un rol IAM especifico (cross-account) basado en el client_id.
Flujo de autenticacion:
clients.json local (en desarrollo)client_idrole_arn en la configuracion de clientessts:AssumeRole hacia el rol correspondienteEl servidor prioriza las fuentes en este orden:
CLIENTS_CONFIG_SECRET esta definida, carga la configuracion desde el secret indicado. La configuracion se cachea en memoria durante 5 minutos (configurable via CLIENTS_CONFIG_CACHE_TTL). Cuando se actualiza el secret, el servidor detecta el cambio automaticamente en el siguiente ciclo de cache sin necesidad de reinicio.CLIENTS_CONFIG_SECRET no esta definida, busca clients.json en la ruta indicada por CLIENTS_CONFIG_PATH o en ubicaciones por defecto relativas al modulo. El fichero se recarga automaticamente cuando cambia (deteccion por mtime).sts:AssumeRole sobre cada ARN de rol de cuentasecretsmanager:GetSecretValue sobre el secret de configuracionEl servidor maneja las peticiones concurrentes de forma segura:
Rol base (identidad del pod via Pod Identity):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::ACCOUNT_ID_1:role/mcp-cost-optimizer",
"arn:aws:iam::ACCOUNT_ID_2:role/mcp-cost-optimizer"
]
},
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:iam::BASE_ACCOUNT_ID:secret:mcp-cost-optimizer/clients"
}
]
}Rol en cada cuenta target (mcp-cost-optimizer):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ce:GetCostAndUsage",
"ce:GetCostForecast",
"ce:GetDimensionValues",
"ce:GetTags",
"ce:GetCostAndUsageComparisons",
"ce:GetCostComparisonDrivers",
"ce:GetReservationUtilization",
"ce:GetReservationCoverage",
"ce:GetReservationPurchaseRecommendation",
"ce:GetSavingsPlansCoverage",
"ce:GetSavingsPlansUtilization",
"ce:GetSavingsPlansPurchaseRecommendation",
"cloudwatch:GetMetricStatistics",
"cloudwatch:GetMetricData",
"cloudwatch:ListMetrics",
"ec2:DescribeRegions",
"ec2:DescribeInstances",
"ec2:DescribeVolumes",
"ec2:DescribeSnapshots",
"ec2:DescribeNatGateways",
"ec2:DescribeAddresses",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"rds:DescribeDBInstances",
"rds:DescribeDBRecommendations",
"s3:ListAllMyBuckets",
"s3:GetBucketLocation",
"s3:GetLifecycleConfiguration",
"s3:GetBucketVersioning"
],
"Resource": "*"
}
]
}Trust policy en cada rol de cuenta target:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::BASE_ACCOUNT_ID:role/mcp-cost-optimizer-CLUSTER_ID"
},
"Action": "sts:AssumeRole"
}
]
}El servidor utiliza el client_id para buscar el rol a asumir. La configuracion puede estar en AWS Secrets Manager o en un fichero local.
#### Ejemplo de configuracion
{
"clients": {
"cuenta-produccion": {
"role_arn": "arn:aws:iam::ACCOUNT_ID_1:role/mcp-cost-optimizer",
"account_id": "ACCOUNT_ID_1",
"account_type": "payer",
"description": "Cuenta de gestion (payer)"
},
"cuenta-desarrollo": {
"role_arn": "arn:aws:iam::ACCOUNT_ID_2:role/mcp-cost-optimizer",
"account_id": "ACCOUNT_ID_2",
"account_type": "linked",
"payer_id": "cuenta-produccion",
"description": "Cuenta de desarrollo (linked)"
}
}
}aws secretsmanager put-secret-value \
--secret-id "mcp-cost-optimizer/clients" \
--secret-string file://clients.json \
--region eu-west-1 --profile <profile>El servidor detecta el cambio automaticamente en los proximos 5 minutos sin reinicio.
| Variable | Requerida | Valor por defecto | Descripcion |
|---|---|---|---|
CLIENTS_CONFIG_SECRET | No* | - | ARN o nombre del secret en AWS Secrets Manager con la configuracion de clientes |
CLIENTS_CONFIG_PATH | No* | - | Ruta al fichero clients.json (alternativa local a Secrets Manager) |
CLIENTS_CONFIG_CACHE_TTL | No | 300 | Segundos de cache para la configuracion de clientes desde Secrets Manager |
AWS_REGION | No | us-east-1 | Region AWS por defecto |
FASTMCP_LOG_LEVEL | No | WARNING | Nivel de logging (ERROR, WARNING, INFO, DEBUG) |
VALIDATE_FILTER_VALUES | No | false | Habilitar llamadas AWS para validacion de filtros |
MCP_TRANSPORT | No | stdio | Modo de transporte: stdio, sse, o streamable-http |
MCP_HOST | No | 0.0.0.0 (contenedor) | Host de escucha para transportes SSE/HTTP |
MCP_PORT | No | 8000 | Puerto de escucha para transportes SSE/HTTP |
MCP_MOUNT_PATH | No | - | Ruta de montaje opcional para transporte SSE/HTTP |
*Se requiere uno de los dos: CLIENTS_CONFIG_SECRET (produccion) o CLIENTS_CONFIG_PATH / fichero local (desarrollo).
El servidor MCP de Cost Explorer proporciona las siguientes herramientas:
| Herramienta | Descripcion |
|---|---|
get_today_date | Obtiene la fecha actual para determinar datos relevantes |
list_active_sessions | Lista todas las sesiones activas de Cost Explorer |
close_session | Cierra una sesion especifica y libera recursos |
| Herramienta | Descripcion |
|---|---|
get_dimension_values | Obtiene los valores disponibles para una dimension especifica (ej. SERVICE, REGION) |
get_tag_values | Obtiene los valores disponibles para una clave de etiqueta |
get_cost_and_usage | Recupera datos de costes y uso de AWS con opciones de filtrado y agrupacion |
get_cost_trend_with_anomalies | Tendencia de 6 meses + deteccion de anomalias en una sola llamada |
| Herramienta | Descripcion |
|---|---|
get_cost_and_usage_comparisons | Compara costes entre dos periodos para identificar cambios y tendencias |
get_cost_comparison_drivers | Analiza que provoco los cambios de coste entre periodos (top 10 factores) |
get_cost_forecast | Genera previsiones de costes basadas en patrones de uso historicos |
get_savings_commitments | Savings Plans y Reserved Instances actuales, cobertura y utilizacion |
| Herramienta | Descripcion |
|---|---|
describe_ec2_instances | Informacion compacta de instancias EC2 |
list_ec2_regions_with_instances | Regiones con instancias (running/stopped) |
describe_ebs_volumes | Volumenes EBS con deteccion de huerfanos |
describe_ebs_snapshots | Snapshots EBS con deteccion de huerfanos |
describe_rds_instances | Instancias RDS |
describe_load_balancers | Load Balancers |
describe_nat_gateways | NAT Gateways |
describe_elastic_ips | Elastic IPs |
list_s3_buckets | Buckets S3 con flags de lifecycle |
| Herramienta | Descripcion |
|---|---|
get_ec2_utilization | Utilizacion de CPU de instancias EC2 via CloudWatch |
get_rds_utilization | Utilizacion de instancias RDS |
get_ebs_utilization | Utilizacion de volumenes EBS |
get_elb_utilization | Utilizacion de Load Balancers |
get_nat_gateway_utilization | Utilizacion de NAT Gateways |
get_multi_resource_utilization | EC2 + RDS agrupados por buckets de utilizacion |
Importante: Siempre hay que pasar el client_id al invocar una herramienta. El servidor asumira el rol correspondiente de la configuracion de clientes.
#### Ejemplo: get_cost_and_usage
{
"client_id": "cuenta-produccion",
"date_range": {
"start_date": "2026-01-01",
"end_date": "2026-01-31"
},
"granularity": "MONTHLY",
"group_by": "SERVICE",
"metric": "UnblendedCost"
}Cada llamada a la API de Cost Explorer cuesta $0.01. El servidor realiza validaciones en las peticiones antes de enviarlas a AWS.
Validaciones locales (siempre se ejecutan, sin llamadas a AWS):
Validaciones AWS (opcionales, deshabilitadas por defecto):
| Operacion | Llamadas API | Coste |
|---|---|---|
| Consulta simple de costes | 1 | $0.01 |
| Consulta con filtro (validacion deshabilitada) | 1 | $0.01 |
| Consulta con filtro (validacion habilitada) | 2+ | $0.02+ |
| Comparacion de costes | 2 | $0.02 |
| Prevision de costes | 1 | $0.01 |
| Modo | Descripcion | Caso de uso |
|---|---|---|
stdio | Entrada/salida estandar | Desarrollo local, herramientas CLI |
sse | Server-Sent Events sobre HTTP | Clientes web, MCP Inspector |
streamable-http | Transporte HTTP streamable | Recomendado para EKS |
# Instalar dependencias
uv sync
# Ejecutar con fichero local
CLIENTS_CONFIG_PATH=./clients.json uv run cost-optimizeraws ecr get-login-password --region eu-west-1 --profile <profile> \
| docker login --username AWS --password-stdin \
675492141136.dkr.ecr.eu-west-1.amazonaws.com
docker build -t mcp-costoptimizer-aws .
docker tag mcp-costoptimizer-aws:latest \
675492141136.dkr.ecr.eu-west-1.amazonaws.com/mcp-costoptimizer-aws:latest
docker push \
675492141136.dkr.ecr.eu-west-1.amazonaws.com/mcp-costoptimizer-aws:latestEl despliegue en EKS se gestiona desde el repo innovation-account. Requiere:
aws secretsmanager create-secret \
--name "mcp-cost-optimizer/clients" \
--secret-string file://clients.json \
--region eu-west-1 --profile <profile>mcp-cost-optimizer en cada cuenta target con los permisos y trust policy indicados en Permisos IAM necesarios.cd config/eu-west-1/envs/cost-optimizer
terragrunt run-all applyEl MCP quedara disponible internamente en el cluster en:
http://mcp.cost-optimizer.svc.cluster.local:8000uv sync --dev
source .venv/bin/activate
pytest tests/ -v -o "addopts="Muestrame los costes de AWS de los ultimos 3 meses agrupados por servicio
Desglosa los costes de S3 por clase de almacenamiento del primer trimestre de 2026
Cuales fueron mis costes de instancias reservadas vs bajo demanda en mayo?Compara mis costes de AWS entre abril y mayo de 2026
Por que aumento mi factura de AWS en junio comparado con mayo?
Que causo el pico en mis costes de S3 el mes pasado?Haz una prevision de mis costes de AWS para el proximo mes
Cual sera mi factura total de AWS para el resto de 2026?Este proyecto esta licenciado bajo la Licencia Apache 2.0 - consulta el fichero LICENSE para mas detalles.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.