Releases: alejooroncoy/campus-cli
Release list
campus-cli v2.2.0
Herramientas MCP consistentes
Campus CLI ahora usa banner_get_weekly_schedule como nombre principal para consultar el horario semanal oficial de Banner UPC. Esto alinea el CLI con el MCP hospedado y con los prefijos del resto de integraciones: blackboard_, banner_ y uclass_.
Compatibilidad
campus_get_weekly_schedule continúa disponible como alias deprecado. Las integraciones existentes siguen funcionando; las nuevas deben usar banner_get_weekly_schedule.
Qué devuelve
Cursos, días, horas, aulas, secciones y cursos sin reuniones presenciales, excluyendo matrículas retiradas o anuladas.
Validación
- 50 pruebas automatizadas aprobadas.
- Build, empaquetado seco y smoke test de la CLI completados.
- Revisión en dos pasadas: 0 findings.
Publicada como campus-cli 2.2.0 con el tag npm latest.
campus-cli v2.1.0
Campus CLI 2.1.0
Esta versión amplía Campus CLI para que asistentes MCP y la terminal puedan acompañar mejor el ciclo académico: consultar el horario oficial, revisar mensajes y acceder a las integraciones académicas disponibles.
Nuevo
- Horario semanal oficial de Banner con campus_get_weekly_schedule: muestra cursos, días, horas y aulas, y excluye matrículas retiradas o anuladas.
- Integración con UClass y sus herramientas MCP para consultar información académica disponible desde Campus.
- Mensajes de Blackboard: blackboard_list_messages y el comando campus messages permiten revisar bandeja, filtros y paginación desde la CLI o un cliente MCP.
Validación
- 49 pruebas automatizadas aprobadas.
- Build, empaquetado seco y smoke test de la CLI completados.
Publicada como campus-cli 2.1.0.
campus-cli v2.0.0 — Seguridad reforzada
Campus CLI 2.0.0
Esta versión mayor fortalece la seguridad del CLI y del servidor MCP ante contenido malicioso, prompt injection y escrituras no autorizadas.
Seguridad
- Confina las descargas a
~/Downloads/campus-clioCAMPUS_DOWNLOAD_DIR, sin escapes por rutas o symlinks, sin sobrescritura y con límites de 100 MB por archivo y 500 MB por raíz. - Publica los archivos descargados de forma atómica y coordina la cuota entre procesos.
- Exige confirmación directa mediante MCP elicitation para subir archivos, entregar tareas y ejecutar métodos raw que modifican datos.
- Restringe la API raw a
/learn/api/public/y las descargas directas al origen HTTPS de Blackboard y/bbcswebdav/. - Persiste únicamente las cookies necesarias de Blackboard y endurece archivos de sesión, cuenta y analítica.
- Añade CSP, HSTS y protección contra framing en el sitio.
Cambios incompatibles
- Node.js 22 o superior es ahora obligatorio.
- Las operaciones sensibles fallan de forma cerrada si el cliente MCP no soporta elicitation.
outputDirsolo acepta subdirectorios relativos dentro de la raíz de descargas configurada.
Dependencias y validación
- Astro actualizado a 7.2.2 y dependencias auditadas.
npm test: 43/43 pruebas aprobadas.npm run build: aprobado.- Smoke test
node run.js --help: aprobado. npm audit --audit-level=high: 0 vulnerabilidades.- Auditoría del sitio: 0 vulnerabilidades.
- Tarball verificado: 72 archivos, sin secretos ni archivos locales.
Publicado en npm como campus-cli@2.0.0 con el dist-tag latest.
v1.4.2 — Validación de IDs + 0 vulnerabilidades de dependencias
Security
- Los IDs de Blackboard (
courseId,contentId,parentId,columnId,attemptId,fileId) se interpolaban sin validar en las URLs de la API REST. Un valor con/o..— por ejemplo, sugerido a un agente por contenido malicioso de un curso — podía redirigir la petición a un endpoint distinto dentro del mismo host. Ahora las 21 tools MCP que reciben alguno de estos campos exigen el formato real de Blackboard (_529580_1) antes de armar la petición.
Fixed
- 10 vulnerabilidades de dependencias resueltas, sin saltar a la última versión mayor de nada:
inquirer10 → 12 (no 14): el mínimo salto donde@inquirer/editordeja de arrastrar el paquetetmpvulnerable (escritura arbitraria de archivos vía symlink, path traversal por prefix/postfix sin sanear).- Se eliminaron
google-auth-library,@modelcontextprotocol/node,@modelcontextprotocol/servery@modelcontextprotocol/client: ninguno se importa en el código — dependencias muertas que arrastraban las vulnerabilidades degaxios/uuidy una versión vieja de@hono/node-server. tsxrefrescado dentro de su propio rango ya declarado, trayendo elesbuildcon el fix de lectura arbitraria de archivos en Windows.
v1.4.1 — Release de seguridad
Security
- Un listado de terceros (mcp-marketplace.io) marcó el paquete con "Use Caution" señalando path traversal en descargas y falta de confirmación al enviar. A partir de ahí, una auditoría propia encontró y cerró además una fuga de sesión más seria:
- El cliente HTTP mandaba la cookie de sesión y el token XSRF del estudiante como headers por defecto, y los seguía enviando aunque la URL de la petición fuera absoluta y apuntara a otro host.
blackboard_raw_api,blackboard_download_file_url,blackboard_download_attachmenty el comandocampus apipodían ser inducidos (por ejemplo, contenido de un curso con instrucciones ocultas para el agente) a mandar la sesión completa a un servidor externo. Ahora cualquier URL absoluta se valida contra el host real de Blackboard antes de salir — la comprobación vive en un solo lugar central, no repetida por cada tool. - Path traversal (CWE-22) en las descargas: un nombre de archivo con
../que Blackboard reportara ya no puede escribir fuera de la carpeta de destino. blackboard_submit_attemptyblackboard_upload_attempt_fileahora exigen una confirmación explícita (confirmed: true) que el propio protocolo MCP valida, en vez de depender solo de que el agente obedezca la instrucción del prompt — cierra la puerta a que contenido malicioso de un curso empuje una entrega o una subida de archivo local sin que el estudiante la vea antes.blackboard_list_peopleya no devuelve el email de un compañero de curso al buscarlo por nombre; solo lo hacía en la vista general, así que la búsqueda quedaba como excepción.- 8 vulnerabilidades de dependencias resueltas (
npm audit fix, sin romper compatibilidad).
Added
Dockerfilepara los verificadores de directorios MCP. Glama y similares arrancan el servidor y le pidentools/list; la imagen no descarga el navegador de Playwright porque el login real ocurre en la máquina del estudiante, no en un contenedor.
Fixed
- El servidor MCP anunciaba
version: 1.0.0en el handshake, escrita a mano y congelada desde entonces. Ahora sale delpackage.json, así que cada cliente y cada directorio ve la versión real.
PR: #16
npm: https://www.npmjs.com/package/campus-cli/v/1.4.1
v1.3.0
Added
campus account login|whoami|logout— cuenta Campus (Google), la identidad compartida entre las apps del ecosistema Campus (CLI, y las que vienen: Profe, Trámites...), separada de la sesión de Blackboard de cada universidad. Login vía navegador con OAuth2+PKCE (redirect a127.0.0.1, igual quegh auth login/gcloud auth login) contra el servicio ya hospedado enmcp.campuscli.com.campus loginahora exige tener una cuenta Campus activa antes de iniciar el SSO de Blackboard: si no hay cuenta, pide corrercampus account loginprimero.campus account login, al terminar, encadena automáticamente el SSO de Blackboard — no hace falta correr los dos comandos por separado.
Notes
- El SSO de Blackboard no cambió: sigue siendo 100% local (Playwright abriendo Chromium/Chrome/Edge), sin pasar por ningún servidor propio. Solo la nueva cuenta Campus usa el backend hospedado.
v1.2.0
Added
blackboard_list_people— lista los docentes y compañeros de un curso, resolviendo el id interno de usuario que traen anuncios y notas a un nombre real. Consearch, busca a una persona puntual y devuelve su email; sinsearch, separa instructores de compañeros (compañeros solo por nombre, sin contacto, salvo que se pida uno en particular).- Analítica de uso opcional vía PostHog: inicio de la CLI, comandos ejecutados, logins, sesiones vencidas, uso de tools MCP, entregas de tareas, etc. No se envían cookies, contraseñas, cursos, tareas ni calificaciones — solo el id de Blackboard como identificador estable. Se puede desactivar con
POSTHOG_DISABLED=1o apuntar a un proyecto propio conPOSTHOG_API_KEY/POSTHOG_HOST(ver README).
Notes
- El backend de trabajo en progreso (dashboard local, relay MCP hospedado, worker de navegador remoto, founders) se movió a un repo privado aparte que consume
campus-clicomo dependencia; nunca estuvo expuesto en una versión publicada, así que no hay cambio visible para quien ya usa el CLI o el MCP.
campus-cli v1.1.2
La versión 1.1.1 se publicó y despublicó el mismo día: el build incluía código compilado de trabajo en curso (app de escritorio/backend, no conectado al CLI) por una limpieza incompleta de
dist/. 1.1.2 es esa misma release, empaquetada correctamente.
Fixed
campus login/silentReloginya no descargan el Chromium de Playwright por defecto:launchPersistentContextSafeprueba primero el Chrome o Edge ya instalado en la máquina (mismo binario, misma versión), y solo si ninguno existe recurre al Chromium empaquetado por Playwright, instalándolo la primera vez que hace falta.run.jsejecutadist/index.jscompilado cuando está disponible en vez de transpilar contsxen cada arranque — inicio más rápido para instalaciones globales/npx.- El paquete publicado en npm ahora solo incluye
dist,run.js,README.mdyCHANGELOG.md(antes se publicaba todo el repo); se agregóprepublishOnlypara garantizar quedist/siempre esté compilado antes de publicar, ybuildahora limpiadist/antes de compilar para no arrastrar archivos de builds anteriores. - El login por SSO de Microsoft ahora detecta el destino real de la navegación (
aulavirtual.upc.edu.pe/ultra) en vez de depender de tiempos de espera fijos, cerrando un caso donde una redirección lenta o falsificada podía dejar la sesión a medio autenticar. - Se corrigieron dos
unhandled rejectionen el flujo de login que podían tumbar el proceso del servidor MCP ante un fallo de red durante la autenticación. - Las llamadas concurrentes a las tools de Blackboard (hasta 5 en paralelo, como permite este mismo agente) ya no compiten por el mismo perfil de navegador: los lanzamientos de Chromium se serializan por sesión en vez de arriesgarse a chocar contra el lock del directorio de perfil.
- Las respuestas de las tools
blackboard_*vía MCP ahora se devuelven en JSON compacto en vez de indentado, reduciendo el consumo de tokens sin perder información.
campus-cli v1.0.2
Fixed
campus assignments list <courseId>now shows grades returned by Blackboard as plaingrade.score, not onlygrade.displayGrade.score.campus assignments list <courseId> --pendingno longer treats graded assignments as pending when the score is returned asgrade.score.- A single course with no pending assignments now prints
No pending assignments found in this course.instead of looking empty.
Validation
npm testnpm run build- Real read-only e2e:
node run.js assignments list _529580_1now shows numeric grades such as1 / 1 (100%). - Real read-only e2e:
node run.js assignments list _529580_1 --pendingreports no pending assignments for that course.
npm
Published as campus-cli@1.0.2 with latest pointing to 1.0.2.
campus-cli v1.0.1
What's new
campus assignments listnow accepts an optionalcourseId.campus assignments list --pendingnow works across all available courses.--pending --jsonnow filters pending assignments correctly in global and single-course mode.- Added a minimal test suite for the assignment listing flow.
- Improved README adoption docs: npm badges, requirements, CLI vs MCP, privacy, troubleshooting, and contribution guidance.
- Cleaned the npm package so local agent files are not included in the tarball.
Validation
npm testnpm run build- Real read-only e2e against Blackboard: global pending assignments across 5 courses, 0 course errors.
npm
Published as campus-cli@1.0.1 with latest pointing to 1.0.1.