Saltar a contenido

Autenticación

El MCP server público (mcp.wiservet.com) acepta exclusivamente API keys per-clínica con prefijo wsv_. JWT de usuario no funciona en este endpoint.

Header obligatorio

Authorization: Bearer wsv_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

Cómo se valida

El MCP server delega 100% la validación al backend principal:

mcp.wiservet.com → POST /api/internal/mcp/validate-key → wiservet.com

El backend verifica:

  1. La key existe y no está revocada (mcp_api_keys.revoked_at IS NULL).
  2. No está expirada (expires_at IS NULL OR expires_at > now()).
  3. El scope solicitado por el tool está en mcp_api_keys.scopes.
  4. El rate limit del día (mcp_api_keys.rate_limit_per_day) no se excedió (counter Redis).

Si todo pasa, retorna clinic_id + key_id + scopes. El MCP server setea SET LOCAL app.current_clinic_id = '{uuid}' antes de cada query → RLS aplica.

Scopes disponibles

Scope Tools Descripción
read (todas) Permiso base para invocar cualquier tool.
query query_database SELECT-only contra DB.
list_tables list_tables Inventario de tablas.
describe_table describe_table Schema de una tabla.
clinic_context get_clinic_context KPIs agregados del día.

Errores

Status Body code Causa
401 INVALID_API_KEY Prefix incorrecto, revocada, expirada
403 MISSING_SCOPE Scope requerido no está en la key
429 RATE_LIMIT_EXCEEDED rate_limit_per_day superado (rolls over UTC)

Audit trail

Cada call exitoso o bloqueado escribe una row en mcp_usage_log:

  • mcp_api_key_id, tool_name, clinic_id
  • request_payload (truncado a 4KB)
  • rows_returned, duration_ms
  • blocked_reason si aplica