Ir al contenido

Permisos

Cada autorización trae una lista explícita de scopes: seis permisos, ni uno más. Cada herramienta declara el permiso que necesita; si la autorización no lo trae, hackÜ responde 403 y la herramienta se niega. Agregar una herramienta nueva nunca amplía lo que una credencial puede leer por su cuenta.

Scope Etiqueta Qué desbloquea
users:read Listar usuarios El padrón de la empresa, una persona a la vez, el ranking y los cargues masivos.
users:pii Ver nombres, correos y teléfonos Que las respuestas que ya devuelven personas incluyan sus datos identificables, en vez de solo el user_id. No abre ninguna herramienta nueva por sí solo.
courses:read Consultar el catálogo de cursos El catálogo de cursos de la empresa y el detalle de uno, con sus módulos.
communications:read Consultar comunicados y sus envíos Los comunicados preparados o enviados, y qué pasó con cada destinatario.
learning:read Consultar evaluaciones, encuestas y pensums Retos, encuestas, evaluaciones, intentos y pensums — el grueso de las herramientas.
reports:generate Pedir reportes en Excel o CSV y ver los generados Ver los reportes ya pedidos, y pedir uno nuevo.

get_context no pide ningún scope: describe la credencial misma (de qué empresa es, en nombre de quién, con qué límites), y quien puede autenticarse ya tiene derecho a saber eso.

Los otros cinco scopes abren o cierran una herramienta entera. users:pii no abre ninguna: modifica lo que ya devuelven list_users, get_user y list_communication_deliveries, agregando nombre, correo, teléfono o número de documento a filas que de otra forma solo traen un id.

Esto es deliberado, según el propio modelo:

USERS_PII está separado de USERS_READ a propósito. Si un deployment puede devolver datos personales es una decisión de configuración; si una credencial dada los recibe es una decisión por persona. Las dos tienen que decir que sí.

En la práctica esto significa dos llaves independientes, no una: la del deployment (MCP_EXPOSE_PII, ver Privacidad y alcance) y la del scope de la credencial. Cada respuesta que puede traer datos personales incluye pii_included: true|false para que quede explícito cuál de los dos modos se está viendo — nunca hay que asumirlo por el resultado.

users:read (5): get_company_overview · list_ranking · list_bulks · list_users · get_user

courses:read (2): list_courses · get_course

communications:read (3): list_communications · get_communication · list_communication_deliveries

learning:read (9): list_challenges · list_surveys · get_survey_results · list_evaluations · list_evaluation_attempts · get_evaluation_attempt · list_pensums · get_pensum · list_pensum_enrolments

reports:generate (2): list_reports · request_report

Sin scope (1): get_context

5 + 2 + 3 + 9 + 2 + 1 = 22 herramientas — el total exacto que expone el servidor.

De las 22, request_report es la única que no es un read. Escribe una fila y encola un trabajo en segundo plano; todo lo demás en este servidor es una consulta. Por eso vive detrás de su propio scope, reports:generate, en vez de compartir users:read u otro scope de lectura — otorgar esa acción tiene que ser una decisión aparte de otorgar visibilidad.