{
  "markdown": "# campus-cli\n\n[![npm version](https://img.shields.io/npm/v/campus-cli.svg)](https://www.npmjs.com/package/campus-cli)\n[![npm downloads](https://img.shields.io/npm/dw/campus-cli.svg)](https://www.npmjs.com/package/campus-cli)\n\n> Conecta Blackboard UPC con ChatGPT y Claude (vía MCP), o úsalo directo desde la terminal.\n\n`campus-cli` (también conocido como **Campus** o **Campus CLI**, [campuscli.com](https://campuscli.com)) es un CLI y servidor MCP no oficial para estudiantes de UPC. Le da a asistentes de IA como ChatGPT y Claude acceso directo a tu **Blackboard Learn**: cursos, tareas, notas, anuncios, mensajes y materiales, sin abrir el navegador. Canvas y Moodle están en el roadmap.\n\nNo confundir con: el paquete `campus-cli` de PyPI (Python, gestión de notebooks de Jupyter, proyecto no relacionado) ni con otras plataformas de \"IA para programadores\" o \"resolver tareas con IA\" que usan nombres parecidos — este proyecto es específicamente la integración de Blackboard con asistentes de IA vía MCP.\n\n```bash\nnpx campus-cli@2.0.0 account login\ncampus courses list\ncampus assignments list --pending\n```\n\n**English summary** — `campus-cli` is an unofficial **Blackboard MCP server** and CLI for students. It exposes Blackboard Learn (currently UPC Aula Virtual, Peru) to any Model Context Protocol client — Claude Desktop, Claude Code, Cursor, GitHub Copilot, Codex CLI, Windsurf — so an AI assistant can read your courses, assignments, due dates, grades, instructor feedback, announcements and course materials, and download files, without you copying anything by hand. Unlike institutional Blackboard integrations, it needs **no OAuth developer key from your university**: it uses the student's own SSO session, locally. Run it with `npx campus-cli@2.0.0 mcp` (stdio). Canvas and Moodle are on the roadmap.\n\n## Qué puedes hacer\n\n- Ver tus cursos del ciclo.\n- Consultar tu horario semanal, con horas y aulas de tus cursos matriculados.\n- Revisar tareas pendientes, fechas de entrega y notas.\n- Descargar archivos y carpetas completas de Blackboard.\n- Consultar anuncios, mensajes, contenidos y calificaciones.\n- En un host de Campus que registre la función y autorice el acceso, obtener guías y plantillas APA 7 en español. El servidor MCP local iniciado con `npx campus-cli ... mcp` no la registra.\n- Usarlo desde Claude, Cursor, Copilot, Codex u otro cliente compatible con MCP.\n- Automatizar consultas con `--json` o con llamadas directas a la API de Blackboard.\n\n## Estado actual\n\n| Universidad | LMS | Estado |\n|---|---|---|\n| UPC | Blackboard Learn | Implementado |\n| UTP, USIL, Norbert Wiener | Canvas | Roadmap |\n| UCSM, UNAP | Moodle | Roadmap |\n\nSi estudias en una universidad con Canvas o Moodle y quieres ayudar a probar o implementar soporte, abre un issue para coordinar.\n\n## Requisitos\n\n- Node.js 22 o superior.\n- Una cuenta activa de UPC con acceso a Aula Virtual.\n- Acceso al flujo normal de Microsoft SSO, incluyendo MFA si tu cuenta lo pide.\n- macOS, Linux o Windows con un entorno donde Playwright pueda abrir Chromium.\n\n## Instalación rápida\n\n### Usar sin instalar\n\n```bash\nnpx campus-cli@2.0.0 account login\n```\n\n### Instalar globalmente\n\n```bash\nnpm install -g campus-cli@2.0.0\ncampus account login\n```\n\n### Clonar el repo\n\n```bash\ngit clone https://github.com/alejooroncoy/campus-cli\ncd campus-cli\nnpm install\nnode run.js account login\n```\n\n`campus-cli` usa Playwright para abrir Chromium durante el login. `npm install` intenta instalar Chromium automáticamente; si el navegador falta, el CLI lo instala la primera vez que lo necesite.\n\n## Primer uso\n\n```bash\ncampus account login\n```\n\nSe abre el navegador para iniciar sesión con tu cuenta Campus (Google) — es la identidad compartida entre las apps del ecosistema Campus, separada de tu sesión de Blackboard. Al terminar, encadena automáticamente el login de Microsoft UPC (Blackboard SSO, 100% local, sin pasar por ningún servidor propio). Si más adelante corres `campus login` por separado, te pedirá primero `campus account login` en caso de no tener una cuenta Campus activa.\n\nInicia sesión con tu cuenta universitaria y completa MFA si aplica.\n\nDurante el login, Microsoft puede mostrar **\"Stay signed in?\"** con el checkbox **\"Don't show this again\"**. Marca ese checkbox y haz clic en **Yes** para que la sesión pueda mantenerse correctamente.\n\nDespués del login:\n\n```bash\ncampus courses list\n```\n\nEjemplo:\n\n```text\n_100001_1  Cálculo Diferencial e Integral [Ultra]\n_100002_1  Programación Orientada a Objetos [Ultra]\n_100003_1  Bases de Datos [Ultra]\n_100004_1  Algoritmos y Estructuras de Datos [Ultra]\n```\n\nLuego puedes revisar tareas de un curso:\n\n```bash\ncampus assignments list _100004_1 --pending\n```\n\nEjemplo:\n\n```text\n_200001_1  Tarea 1  [manual]\n  Nota: sin entregar · Máx: 5 pts · Entrega: 15/04/2026\n```\n\n## Comandos principales\n\n### Cuenta Campus\n\n```bash\ncampus account login      # iniciar sesión con Google (encadena el login de Blackboard)\ncampus account whoami     # cuenta Campus activa\ncampus account logout     # cerrar sesión de la cuenta Campus en este equipo\n```\n\n### Sesión (Blackboard)\n\n```bash\ncampus login              # iniciar sesión con Microsoft SSO (pide cuenta Campus primero)\ncampus logout             # borrar sesión local\ncampus whoami             # usuario activo y tiempo restante\ncampus status             # sesión + versión del servidor Blackboard\n```\n\n### Cursos\n\n```bash\ncampus courses list\ncampus courses get <courseId>\ncampus courses contents <courseId>\ncampus courses contents <courseId> --parent <folderId>\ncampus courses contents <courseId> --type file|folder|assignment\ncampus courses announcements <courseId>\ncampus courses grades <courseId>\ncampus messages\ncampus messages --course <courseId>\n```\n\n### Tareas\n\n```bash\ncampus assignments list <courseId>\ncampus assignments list\ncampus assignments list --pending\ncampus assignments list <courseId> --pending\ncampus assignments attempts <courseId> <assignmentId>\ncampus assignments submit <courseId> <assignmentId> -f tarea.pdf\ncampus assignments submit <courseId> <assignmentId> -t \"Mi respuesta\" -c \"Comentario\"\ncampus assignments submit <courseId> <assignmentId> -f borrador.pdf --draft\n```\n\n### Descargas\n\n```bash\ncampus download <courseId> <contentId>\ncampus download-folder <courseId> <folderId> -o ./materiales/\ncampus download-folder <courseId> <folderId> --filter \"parcial\"\n```\n\n### API y scripting\n\n```bash\ncampus api GET /learn/api/public/v1/users/me\ncampus api GET /learn/api/public/v1/courses -q \"limit=10\"\ncampus endpoints\ncampus endpoints --json\n```\n\nTodos los comandos aceptan `--json`. Los spinners van a `stderr`, así que puedes usar `--json 2>/dev/null` para obtener JSON limpio en scripts.\n\n## CLI o MCP\n\n| Modo | Úsalo cuando quieres | Ejemplo |\n|---|---|---|\n| CLI | Ejecutar comandos directos desde la terminal | `campus assignments list --pending` |\n| MCP | Darle acceso a tu campus a un asistente de IA | \"Qué tareas tengo pendientes esta semana?\" |\n| API raw | Automatizar consultas o explorar endpoints | `campus api GET /learn/api/public/v1/users/me` |\n\nPuedes usar ambos modos con la misma sesión. Primero ejecuta `campus login`; luego usa el CLI manualmente o conecta el servidor MCP a tu cliente de IA.\n\n## Uso con IA mediante MCP\n\n`campus-cli` incluye un servidor MCP estándar. Corre por `stdio` con:\n\n```bash\nnpx campus-cli@2.0.0 mcp\n```\n\nEso permite conectar tu campus a clientes como Claude, Cursor, GitHub Copilot, OpenAI Codex CLI, Windsurf y otros clientes compatibles con Model Context Protocol.\n\nAdemás de las herramientas de Blackboard, el MCP incluye `banner_get_weekly_schedule`: consulta tu matrícula en Banner UPC y organiza las clases de lunes a domingo. Por defecto usa el período activo; también puedes pasar un código de período si quieres revisar un ciclo anterior. `campus_get_weekly_schedule` sigue disponible como alias deprecado para integraciones existentes.\n\n### Claude Code\n\nAgrega esto a `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"campus\": {\n      \"command\": \"npx\",\n      \"args\": [\"campus-cli@2.0.0\", \"mcp\"]\n    }\n  }\n}\n```\n\n### Claude Desktop\n\nEdita `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"campus\": {\n      \"command\": \"npx\",\n      \"args\": [\"campus-cli@2.0.0\", \"mcp\"]\n    }\n  }\n}\n```\n\n### Cursor\n\nUsa `Settings -> MCP -> Add new MCP server`, o edita `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"campus\": {\n      \"command\": \"npx\",\n      \"args\": [\"campus-cli@2.0.0\", \"mcp\"]\n    }\n  }\n}\n```\n\n### GitHub Copilot en VS Code\n\nCrea `.vscode/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"campus\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"campus-cli@2.0.0\", \"mcp\"]\n    }\n  }\n}\n```\n\n### OpenAI Codex CLI\n\nAgrega esto a `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.campus]\ncommand = \"npx\"\nargs = [\"campus-cli@2.0.0\", \"mcp\"]\n```\n\n### Windsurf\n\nEdita `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"campus\": {\n      \"command\": \"npx\",\n      \"args\": [\"campus-cli@2.0.0\", \"mcp\"]\n    }\n  }\n}\n```\n\nSi instalaste el paquete globalmente con `npm install -g campus-cli@2.0.0`, puedes reemplazar `npx campus-cli@2.0.0` por la ruta absoluta de `campus`.\n\n### Configuración mínima\n\nTodos los clientes MCP terminan usando la misma idea:\n\n```json\n{\n  \"command\": \"npx\",\n  \"args\": [\"campus-cli@2.0.0\", \"mcp\"]\n}\n```\n\nEl formato exacto cambia por cliente, pero el comando y los argumentos son los mismos.\n\n### Guías paso a paso\n\nCada cliente tiene su guía con la ruta exacta del archivo, cómo verificar la conexión y qué hacer si falla:\n\n- [Claude Desktop](https://campuscli.com/blackboard-mcp/claude-desktop/)\n- [Claude Code](https://campuscli.com/blackboard-mcp/claude-code/)\n- [Cursor](https://campuscli.com/blackboard-mcp/cursor/)\n- [GitHub Copilot en VS Code](https://campuscli.com/blackboard-mcp/github-copilot/)\n- [OpenAI Codex CLI](https://campuscli.com/blackboard-mcp/codex/)\n- [Windsurf](https://campuscli.com/blackboard-mcp/windsurf/)\n\n## Herramientas MCP\n\nLas herramientas de Aula Virtual usan el prefijo `blackboard_`; `banner_get_weekly_schedule` consulta la matrícula en Banner UPC. Las de UPC Class usan `uclass_`: entregan fuentes estructuradas para que la IA conectada (Codex, Claude, ChatGPT, etc.) las interprete, sin enviar la grabación a una IA propia del CLI.\n\n| Herramienta | Descripción |\n|---|---|\n| `blackboard_whoami` | Usuario autenticado |\n| `blackboard_list_courses` | Cursos inscritos |\n| `blackboard_get_course` | Detalle de un curso |\n| `blackboard_list_contents` | Materiales y carpetas |\n| `blackboard_list_announcements` | Anuncios del curso |\n| `blackboard_list_messages` | Mensajes de la bandeja de entrada de Blackboard |\n| `blackboard_list_assignments` | Tareas con fechas y notas |\n| `blackboard_list_attempts` | Historial de entregas |\n| `blackboard_get_grades` | Reporte de notas |\n| `blackboard_list_attachments` | Archivos adjuntos |\n| `blackboard_download_attachment` | Descargar archivo dentro de `~/Downloads/campus-cli` |\n| `blackboard_upload_attempt_file` | Subir un archivo local; el cliente MCP pide confirmación directa |\n| `blackboard_save_attempt_draft` | Guardar texto/archivos en un intento SIN enviarlo (queda abierto para seguir editando) |\n| `blackboard_submit_attempt` | Entregar tarea; el cliente MCP pide confirmación directa |\n| `blackboard_get_assignment_feedback` | Comentarios y feedback del profesor |\n| `blackboard_system_version` | Versión del servidor Blackboard |\n| `blackboard_list_people` | Docentes y compañeros del curso; resuelve un id interno a un nombre |\n| `blackboard_download_file_url` | Descargar un archivo desde una URL bbcswebdav |\n| `blackboard_download_feedback_file` | [EXPERIMENTAL] Descargar un archivo de feedback adjunto a una nota |\n| `blackboard_raw_api` | API pública de Blackboard; los métodos que modifican datos piden confirmación directa |\n| `banner_get_weekly_schedule` | Horario semanal UPC de la matrícula activa (horas, aulas, secciones y cursos sin clase presencial) |\n| `campus_get_weekly_schedule` | Alias deprecado de `banner_get_weekly_schedule`; se mantiene temporalmente por compatibilidad |\n| `uclass_list_recordings` | Grabaciones publicadas de UPC Class para un curso Blackboard |\n| `uclass_search_transcript` | Fragmentos con contexto y marcas de tiempo de una transcripción de Class |\n| `uclass_read_transcript` | Transcripción estructurada completa de una grabación de Class |\n\nLas descargas MCP nunca escriben fuera de `~/Downloads/campus-cli`, no sobrescriben archivos y aplican límites de 100 MB por archivo y 500 MB para la raíz completa. Puedes elegir otra raíz al iniciar el servidor con `CAMPUS_DOWNLOAD_DIR=/ruta/segura`; el argumento `outputDir` de las tools solo crea subdirectorios relativos dentro de ella. Las subidas, entregas finales y llamadas raw que modifican datos requieren que el cliente soporte MCP elicitation; si no la soporta, la operación falla sin ejecutarse.\n\nLas transcripciones de Class se consultan por HTTP desde la sesión SSO existente, no se descarga el video ni el audio. Durante la sesión MCP se reutilizan la lista de grabaciones y la transcripción ya leída; al cerrar el proceso esa caché en memoria desaparece.\n\nEjemplos de uso con un asistente:\n\n```text\nQué tareas tengo pendientes esta semana?\nDescarga todos los PDFs del curso de Finanzas.\nCuál es mi nota actual en Arquitectura de Software?\nBusca los materiales sobre el parcial.\n```\n\nEjemplo de conversación:\n\n```text\nUsuario: Qué tareas tengo pendientes esta semana?\nIA: Tienes 2 pendientes:\n- Tarea 1 de Algoritmos, vence el 15/04.\n- Lectura de Bases de Datos, vence el 18/04.\n```\n\n## Seguridad y privacidad\n\n- No necesitas escribir tu contraseña en la terminal.\n- No hay servidor intermedio de `campus-cli`.\n- Puedes cerrar sesión y borrar las cookies locales con `campus logout`.\n- Es un proyecto no oficial; no está afiliado a UPC, Blackboard, Canvas ni Moodle.\n- Tus credenciales se ingresan directamente en la ventana de Microsoft, no en el CLI.\n- Las cookies se guardan localmente en tu máquina.\n- La sesión local se guarda en `~/.blackboard-cli/session.json` con permisos restrictivos.\n- No se envían cookies, credenciales ni datos académicos a servidores externos; la analítica opcional de PostHog solo recibe eventos de uso.\n- Úsalo solo con tu propia cuenta y respeta las reglas de tu universidad.\n\nUPC usa SAML SSO con Microsoft Azure AD. El CLI abre Chromium con Playwright, espera a que completes el login, captura las cookies de Blackboard al volver a `/ultra` y las reutiliza para llamar la REST API.\n\n## Problemas comunes\n\n### `Not authenticated`\n\nTu sesión local expiró o no existe. Ejecuta:\n\n```bash\ncampus login\n```\n\n### Microsoft pide login cada vez\n\nCuando aparezca **\"Stay signed in?\"**, marca **\"Don't show this again\"** y responde **Yes**. Si ya habías iniciado sesión antes, prueba borrar la sesión local:\n\n```bash\ncampus logout\ncampus login\n```\n\n### Chromium o Playwright no abre\n\nNormalmente el CLI instala Chromium automáticamente. Si instalaste dependencias con scripts desactivados, vuelve a instalar:\n\n```bash\nnpm install\n```\n\nLuego intenta de nuevo:\n\n```bash\ncampus login\n```\n\n### Un curso o archivo no aparece\n\nPrimero confirma que aparece en Aula Virtual desde el navegador. Si aparece en Blackboard pero no en el CLI, abre un issue con:\n\n- Comando ejecutado.\n- Si usaste `--json`.\n- Tipo de contenido que falta: curso, carpeta, archivo, tarea o nota.\n- Mensaje de error, si lo hubo.\n\nNo publiques cookies, tokens, capturas con datos personales ni archivos privados del curso.\n\n## Desarrollo\n\n```bash\nnpm install\nnpm run build\nnode run.js --help\n```\n\nStack principal:\n\n- TypeScript\n- Playwright\n- Axios\n- Commander.js\n- MCP SDK\n- Chalk y Ora\n\nLa arquitectura separa cada LMS en `src/providers/<lms>/`. Blackboard vive en `src/providers/blackboard/`; futuros providers deberían seguir el mismo patrón.\n\n## Roadmap\n\n- Soporte para Canvas.\n- Soporte para Moodle.\n- Notificaciones de entregas próximas.\n- Descarga de grabaciones o videos, si el LMS lo permite.\n- Soporte para múltiples cuentas o ciclos.\n- Más guías por cliente MCP.\n\nSi tu universidad usa Canvas o Moodle, abre un issue con el nombre de la universidad, el LMS y qué flujo quieres probar primero: cursos, tareas, notas o materiales.\n\n## Contribuir\n\n## Analítica de uso con PostHog\n\nEl cliente registra en PostHog el inicio de la CLI, los logins exitosos y la apertura del dashboard. No se envían cookies, contraseñas, cursos, tareas ni calificaciones.\n\nComo identificador estable se usa el **ID de tu cuenta Campus**, la que creas con `campus account login`. Si no tienes cuenta Campus, se usa un UUID aleatorio generado en tu máquina que no identifica a nadie. En ningún caso se envía tu identificador de Blackboard: es una credencial de la universidad y no sale de tu equipo.\n\nEsto es seudónimo, no anónimo: quien tenga acceso a nuestro PostHog puede distinguir a un usuario de otro y, cruzando con nuestra base de cuentas, saber de quién se trata. Lo decimos así de claro a propósito.\n\nSolo viajan las propiedades de esta lista blanca: `app`, `attempts_count`, `command`, `duration_ms`, `error_type`, `has_comments`, `has_file`, `has_text`, `method`, `mode`, `parent_command`, `status_code`, `success`, `tool` y `version`. Cualquier otra clave se descarta antes de enviar, así que un evento nuevo no puede filtrar el nombre de un curso por descuido. El código está en [`src/analytics.ts`](src/analytics.ts) y son cuarenta líneas: léelas.\n\nLa clave pública del proyecto está configurada por defecto. Para cambiar el proyecto o desactivar la analítica:\n\n```bash\nPOSTHOG_API_KEY=phc_... POSTHOG_HOST=https://us.i.posthog.com campus status\nPOSTHOG_DISABLED=1 campus status\n```\n\nEn PostHog puedes consultar `login_started`, `login_success`, `login_failed`, `session_expired`, `cli_started`, `cli_command_started`, `cli_command_completed`, `cli_error`, `mcp_tool_used`, `mcp_tool_error`, `dashboard_opened`, `dashboard_loaded`, `dashboard_error`, `attempts_viewed`, `assignment_submission_started`, `assignment_file_uploaded`, `assignment_file_upload_error`, `assignment_draft_saved`, `assignment_submitted` y `assignment_submission_error`. Las propiedades `tool`, `command`, `mode`, `success`, `duration_ms`, `error_type` y `status_code` permiten analizar usuarios nuevos, retención, abandono del login, sesiones vencidas, errores, tiempos de respuesta, herramientas y comandos más usados, borradores y entregas finales.\n\nLas contribuciones más útiles ahora son:\n\n- Probar el CLI en más cursos de UPC y reportar errores con el comando usado.\n- Confirmar versiones de Blackboard donde funciona o falla.\n- Ayudar con soporte para Canvas o Moodle si tienes una cuenta de prueba.\n- Mejorar ejemplos, screenshots, docs de instalación o configuraciones MCP.\n\nAntes de trabajar en un provider nuevo, abre un issue para coordinar el alcance.\n\n## Licencia\n\nISC\n",
  "bytes": 18900,
  "sha": "f7541bad0e460c18711faf0596cf348c56ed12f559089771248b9e9da2f7ba99",
  "repo_slug": "alejooroncoy/campus-cli",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_alejooroncoy_campus_cli_f5015e51/readme"
}