El problema
Los servidores MCP otorgan a los agentes de IA acceso a las herramientas, pero no existe un mecanismo estándar para auditar qué permisos expone cada servidor o para imponer restricciones de alcance. Un servidor MCP que proporciona búsqueda también puede exponer el acceso al sistema de archivos, consultas de bases de datos o envío de correo electrónico. Cuando se conectan varios servidores MCP a un agente, se desconoce la superficie de permisos acumulativos. Un servidor comprometido o mal configurado puede brindarle a un agente capacidades que nunca fueron previstas. La especificación MCP no incluye un modelo de permiso, por lo que la aplicación recae enteramente en el integrador.
La solucion de Scavio
Cree una capa de auditoría de permisos que haga un inventario de todas las herramientas expuestas por cada servidor MCP en su implementación, las clasifique por nivel de riesgo y aplique una lista de permitidos. Antes de que un agente pueda llamar a una herramienta, la capa de permisos verifica si esa herramienta está dentro del alcance aprobado para esa función de agente. El servidor MCP de Scavio en mcp.scavio.dev/mcp solo expone herramientas de búsqueda sin sistema de archivos, base de datos o capacidades de correo electrónico, lo que lo convierte en el servidor MCP de menor riesgo para conectarse. La capa de auditoría registra cada invocación de herramienta para la revisión del cumplimiento.
Antes
Antes de la aplicación de permisos, los servidores MCP otorgaban a los agentes un acceso amplio y no auditado a las herramientas. Nadie conocía la superficie de permisos acumulativos entre los servidores conectados, y un servidor mal configurado podría exponer silenciosamente capacidades peligrosas.
Después
Después de crear la capa de auditoría de permisos, cada invocación de la herramienta MCP se compara con una lista de alcance aprobada. El equipo sabe exactamente a qué puede acceder cada agente y las llamadas de herramientas no autorizadas se bloquean y registran para su revisión.
Para quien es
Ingenieros de plataforma y equipos de seguridad que implementan servidores MCP en producción y necesitan visibilidad del área de permisos. Cualquiera que conecte varios servidores MCP a agentes sin un modelo de permisos centralizado.
Beneficios clave
- Inventario de todas las herramientas expuestas por cada servidor MCP conectado
- La categorización de riesgos señala capacidades de herramientas de alto riesgo
- La aplicación de la lista de permitidos bloquea las invocaciones de herramientas no autorizadas
- Registro de auditoría para revisión de cumplimiento y seguridad
- Scavio MCP expone solo herramientas de búsqueda con una superficie de riesgo mínima
Ejemplo en Python
import json
from dataclasses import dataclass
@dataclass
class MCPPermission:
server: str
tool: str
risk_level: str # low, medium, high
approved: bool
def audit_mcp_servers(servers: dict) -> list[MCPPermission]:
"""Audit MCP server permissions and flag risk levels."""
permissions = []
high_risk_patterns = ["file", "database", "email", "exec", "shell", "write"]
medium_risk_patterns = ["delete", "update", "create"]
for server_name, tools in servers.items():
for tool in tools:
tool_lower = tool.lower()
risk = "low"
if any(p in tool_lower for p in high_risk_patterns):
risk = "high"
elif any(p in tool_lower for p in medium_risk_patterns):
risk = "medium"
permissions.append(MCPPermission(
server=server_name,
tool=tool,
risk_level=risk,
approved=risk != "high",
))
return permissions
def enforce_permissions(permissions: list[MCPPermission], server: str, tool: str) -> bool:
"""Check if a tool call is allowed."""
for p in permissions:
if p.server == server and p.tool == tool:
return p.approved
return False # Deny by default
# Example: Audit connected MCP servers
servers = {
"scavio_mcp": ["search_google", "search_youtube", "search_amazon", "search_reddit", "search_tiktok"],
"internal_mcp": ["query_database", "read_file", "write_file", "send_email", "search_docs"],
}
perms = audit_mcp_servers(servers)
print("MCP Permission Audit:")
for p in perms:
status = "APPROVED" if p.approved else "BLOCKED"
print(f" [{p.risk_level:6s}] {p.server}/{p.tool} -> {status}")
high_risk = [p for p in perms if p.risk_level == "high"]
print(f"\nHigh-risk tools found: {len(high_risk)}")
for p in high_risk:
print(f" {p.server}/{p.tool} -> BLOCKED")Ejemplo en JavaScript
function auditMcpServers(servers) {
const highRisk = ["file", "database", "email", "exec", "shell", "write"];
const medRisk = ["delete", "update", "create"];
const perms = [];
for (const [server, tools] of Object.entries(servers)) {
for (const tool of tools) {
const lower = tool.toLowerCase();
let risk = "low";
if (highRisk.some((p) => lower.includes(p))) risk = "high";
else if (medRisk.some((p) => lower.includes(p))) risk = "medium";
perms.push({ server, tool, risk, approved: risk !== "high" });
}
}
return perms;
}
const servers = {
scavio_mcp: ["search_google", "search_youtube", "search_amazon", "search_reddit", "search_tiktok"],
internal_mcp: ["query_database", "read_file", "write_file", "send_email", "search_docs"],
};
const perms = auditMcpServers(servers);
console.log("MCP Permission Audit:");
for (const p of perms) console.log(` [${p.risk.padEnd(6)}] ${p.server}/${p.tool} -> ${p.approved ? "APPROVED" : "BLOCKED"}`);
const blocked = perms.filter((p) => p.risk === "high");
console.log(`\nHigh-risk tools blocked: ${blocked.length}`);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA
YouTube
Búsqueda de videos con transcripciones y metadatos
Amazon
Búsqueda de productos con precios, calificaciones y reseñas
Walmart
Búsqueda de productos con precios y datos de cumplimiento
Comunidad, publicaciones y comentarios en hilos de cualquier subreddit
TikTok
Descubrimiento de videos, creadores y productos en tendencia