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¶
Cómo se valida¶
El MCP server delega 100% la validación al backend principal:
El backend verifica:
- La key existe y no está revocada (
mcp_api_keys.revoked_at IS NULL). - No está expirada (
expires_at IS NULL OR expires_at > now()). - El scope solicitado por el tool está en
mcp_api_keys.scopes. - 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_idrequest_payload(truncado a 4KB)rows_returned,duration_msblocked_reasonsi aplica