production-mcp-server
production-mcp-server
Un servidor MCP (Model Context Protocol) de nivel de producción que demuestra cómo exponer herramientas de forma segura a los agentes de IA en entornos empresariales.
La mayoría de los ejemplos de MCP muestran cómo conectar herramientas a agentes. Este repositorio muestra cómo hacerlo de forma segura a escala — con aplicación de permisos, salvaguardas de comportamiento, controles de radio de explosión y pistas de auditoría estructuradas en cada invocación.
El problema → Solución → Impacto
Problema | Los agentes de IA necesitan acceso a herramientas para resultar útiles — pero el acceso sin restricciones provoca incidentes de producción. Los equipos o restringen a los agentes (inútiles) o les dan acceso total (peligroso). |
Solución | Una capa de puerta de enlace MCP gobernada que se sitúa entre cada agente y cada herramienta: con permisos verificados, radio de explosión controlado y auditoría completa en cada llamada. |
Impacto | Los agentes operan de forma segura en producción con autorización de nivel empresarial. Los equipos de seguridad pueden auditar cada acción. Los desarrolladores publican funciones de agentes sin temor a efectos secundarios. |
Related MCP server: evav-gateway
Diseño del sistema
graph TD
A[🤖 AI Agent<br/>Claude / Any LLM] -->|MCP Protocol| B
subgraph MCP Gateway — Governed Tool Access
B[Request Received] --> C{Layer 1<br/>Permission Check}
C -->|Missing permissions| D[❌ Denied<br/>Audit logged]
C -->|Permitted| E{Layer 2<br/>Blast-Radius Guard}
E -->|HIGH risk, no confirmation| F[❌ Blocked<br/>Audit logged]
E -->|Confirmed or LOW/MED| G{Layer 3<br/>Input Validation}
G -->|Path traversal / SQL injection| H[❌ Blocked<br/>Audit logged]
G -->|Clean inputs| I[✅ Tool Handler Executes]
end
I --> J[(Tool Registry<br/>name · permissions · risk_level)]
I --> K[📋 Audit Trail<br/>every call · permitted or denied]
subgraph Tools
I --> L[📊 Read Metrics]
I --> M[🔍 Query Database]
I --> N[🚀 Trigger Rollback<br/>HIGH RISK — requires confirmed=True]
endDesglose de capas
Capa | Qué hace | Por qué importa |
Registro de herramientas | Almacena nombre, descripción, permisos requeridos y nivel de riesgo para cada herramienta | Fuente única de verdad — ninguna herramienta se ejecuta sin estar registrada |
Aplicación de permisos | Comprueba los permisos del llamador frente a los requisitos de la herramienta antes de la ejecución | Los agentes solo pueden llamar a las herramientas para las que están autorizados explícitamente |
Protección de radio de explosión | Requiere | Los agentes no pueden provocar accidentalmente operaciones destructivas |
Validación de entradas | Bloquea path traversal, SQL destructivo y otros patrones de ataque | Defensa en profundidad — valida antes de que se ejecute cualquier manejador |
Pista de auditoría | Registro inmutable de solo añadidura de cada invocación | Auditabilidad completa para el cumplimiento normativo y la depuración |
El problema
Cuando los agentes de IA obtienen acceso a herramientas, surgen de inmediato tres modos de fallo:
Acceso sin restricciones — los agentes llaman a herramientas que no deberían, lo que causa efectos secundarios no deseados.
Sin pista de auditoría — cuando algo sale mal, no se puede reconstruir lo que hizo el agente.
Fallos silenciosos — los errores de permisos se omiten, lo que imposibilita la depuración.
Este servidor aborda los tres.
Arquitectura
Agent (Claude / any LLM)
│
▼ MCP Protocol
┌─────────────────────────────┐
│ MCP Server │
│ ┌──────────────────────┐ │
│ │ Guardrail Layer │ │ ← permission check → blast-radius guard → arg validation
│ └──────────┬───────────┘ │
│ │ │
│ ┌──────────▼───────────┐ │
│ │ Tool Registry │ │ ← name, description, required_permissions, risk_level
│ └──────────┬───────────┘ │
│ │ │
│ ┌──────────▼───────────┐ │
│ │ Tool Handlers │ │ ← plain Python functions, no security logic here
│ └──────────────────────┘ │
│ │ │
│ ┌──────────▼───────────┐ │
│ │ Audit Trail │ │ ← every invocation logged, permitted or denied
│ └──────────────────────┘ │
└─────────────────────────────┘Patrones clave
1. Acceso gobernado a herramientas
Cada herramienta se registra con requisitos de permisos explícitos:
registry.register(ToolDefinition(
name="trigger_rollback",
description="Initiate a deployment rollback.",
handler=trigger_rollback,
required_permissions={"deployments:write", "deployments:rollback"},
risk_level=RiskLevel.HIGH,
requires_confirmation=True, # blast-radius guard
))2. Aplicación de permisos
La capa de salvaguarda comprueba los permisos antes de que se ejecute cualquier manejador:
# Agent tries to trigger rollback but lacks deployments:write
guardrails.invoke(
tool_name="trigger_rollback",
arguments={"deployment_id": "d-123", "reason": "high error rate"},
caller_id="monitoring-agent",
caller_permissions={"deployments:read"}, # missing write permission
)
# → PermissionDeniedError: Caller 'monitoring-agent' lacks permissions
# {'deployments:write', 'deployments:rollback'} for tool 'trigger_rollback'3. Controles de radio de explosión
Las herramientas de riesgo ALTO requieren una bandera de confirmación explícita — los agentes no pueden activar accidentalmente operaciones destructivas:
# Without confirmation — blocked
guardrails.invoke("trigger_rollback", {...}, confirmed=False)
# → GuardrailViolationError: HIGH risk tool requires confirmed=True
# With confirmation — permitted
guardrails.invoke("trigger_rollback", {...}, confirmed=True)4. Validación de entradas
Las comprobaciones a nivel de argumentos se ejecutan antes que cualquier manejador de herramienta:
# Path traversal — blocked automatically
guardrails.invoke("read_file", {"path": "../../etc/passwd"}, ...)
# → GuardrailViolationError: Path traversal detected
# Destructive SQL — blocked automatically
guardrails.invoke("query", {"query": "DROP TABLE users"}, ...)
# → GuardrailViolationError: Destructive SQL pattern detected5. Pista de auditoría estructurada
Cada invocación — permitida o denegada — queda registrada:
# After some invocations
events = audit.get_events()
print(events[0].to_json())
# {
# "tool_name": "read_deployment_status",
# "caller_id": "oncall-agent-v1",
# "arguments": {"deployment_id": "d-abc"},
# "result": "{'status': 'healthy', ...}",
# "permitted": true,
# "timestamp": "2026-08-26T14:30:00+00:00",
# "duration_ms": 12.4
# }
print(f"Denied requests: {audit.denied_count()}")Estructura del proyecto
production-mcp-server/
├── src/
│ ├── server.py # MCP server entry point — tool registration + FastMCP wiring
│ ├── registry.py # Tool registry — metadata, permissions, risk classification
│ ├── guardrails.py # Guardrail layer — 3-layer enforcement on every invocation
│ ├── audit.py # Structured audit trail — append-only event log
│ └── tools/
│ └── example_tools.py # Example handlers — swap with your real data sources
├── tests/
│ ├── test_guardrails.py # Permission enforcement, blast-radius, input validation
│ └── test_registry.py # Tool registration and lookup
├── examples/
│ └── basic_usage.py # Standalone usage without the MCP server
└── pyproject.tomlInstalación
pip install -e ".[dev]"Ejecutar el servidor
python -m src.serverConecta cualquier cliente compatible con MCP (Claude Desktop, Claude Code, etc.) al servidor.
Ejecutar pruebas
pytest tests/ -vExtensión
Añadir una nueva herramienta
Escribe la función del manejador en
src/tools/:
def read_config(config_key: str) -> str:
return os.environ.get(config_key, "not_found")Regístrala con permisos y nivel de riesgo:
registry.register(ToolDefinition(
name="read_config",
description="Read a configuration value by key.",
handler=read_config,
required_permissions={"config:read"},
risk_level=RiskLevel.LOW,
))Exponla mediante FastMCP:
@mcp.tool()
def config(config_key: str) -> str:
return guardrails.invoke("read_config", {"config_key": config_key}, ...)Las capas de salvaguarda y auditoría se aplican automáticamente — no se necesitan cambios allí.
Integración de tu capa de autenticación
Reemplaza los estáticos CALLER_ID / CALLER_PERMISSIONS en server.py por tu proveedor de identidad real:
# Example: derive permissions from an OAuth token in the MCP session context
def get_caller_context(session) -> tuple[str, set[str]]:
token = session.headers.get("Authorization")
claims = verify_jwt(token)
return claims["sub"], set(claims["permissions"])Por qué esto importa
Los agentes de IA que operan con acceso a herramientas en producción necesitan los mismos controles que cualquier servicio privilegiado: autorización de privilegio mínimo, validación de entradas, límites de radio de explosión y una pista de auditoría completa. Este repositorio es una implementación de referencia de esos patrones mediante el protocolo MCP.
Licencia
MIT
Parte del stack de infraestructura agéntica
Este repositorio es una pieza de un portafolio de infraestructura de agentes de IA de producción:
Repo | Qué es |
Diseño completo del sistema: cómo encajan estas piezas en un despliegue de producción que eliminó el 95 % del triaje manual de incidencias en guardia | |
← Estás aquí: la capa de gobernanza de MCP | |
Cómo se mide la calidad de los agentes y se detectan las regresiones antes de que se publiquen |
This server cannot be deployed
Maintenance
Related MCP Connectors
- gatewayOAuthai.sealgate
MCP gateway with runtime security policy, tool-call-level control, and audit of agent actions.
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
Find, vet, and run MCP tools through a secure audited gateway with prompt-injection risk scoring
Governed app access for AI agents: 1,000+ apps & 12,000+ tools via Code Mode MCP.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables AI agents to securely call MCP tools with risk scoring, checkpoints, rollback, and approval workflows.17 npmMIT
evav-gatewayofficial
AlicenseNot gradedqualityDmaintenanceGoverned MCP gateway that lets AI agents call tools with policy enforcement, prompt-injection screening, a kill-switch, and tamper-evident signed audit logs.Apache 2.0- AlicenseNot gradedqualityBmaintenanceEnables agents to invoke declared API capabilities through a governed MCP surface where each call is risk-tiered — low-risk calls execute immediately, medium-risk writes queue for human approval, and high-risk actions are withheld from the tool list entirely. Every call, decision and denial is recorded in an audit trail, and responses carrying third-party text are scanned for prompt-injection signals before an agent can read them.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to securely reach enterprise tools and other agents through a governed gateway with pinned tool definitions, delegated authorization, content inspection, human approval, and signed audit trails.Apache 2.0