usp-mcp
# usp-mcp
MCP (Model Context Protocol) server para os sistemas estudantis da
Universidade de São Paulo — Moodle (e-Disciplinas), JupiterWeb, notas,
faltas, grade horária e tarefas — usando o
[Heidy backend](https://github.com/iDavi/heidy_backend) como camada de
acesso segura.
Com ele, um assistente (Claude Desktop, Claude Code, ou qualquer cliente
MCP) consegue responder coisas como *"quais atividades tenho no Moodle
essa semana?"*, *"como está minha média em ACH2034?"* ou *"monta minha
grade de horários"*.
## Como funciona
```
cliente MCP ──stdio/HTTP──▶ usp-mcp (Python/FastAPI) ──HTTPS──▶ Heidy backend ──▶ Moodle / JupiterWeb
```
- **A senha nunca viaja em texto claro.** No login, o servidor busca a
chave pública atual do backend (`GET /auth/login-key`) e sela a Senha
Única num envelope HPKE-Base(X25519, HKDF-SHA256, AES-256-GCM). Só o
backend consegue abri-lo, e a senha não é retida em lugar nenhum deste
processo depois do login.
- **A sessão vive só em memória.** O login devolve um bearer token e um
*credential blob* (ciphertext opaco que só o backend abre); ambos ficam
apenas na memória do processo e são descartados no logout.
## Instalação
```bash
pip install . # ou: pip install -e .[dev] para desenvolver
```
## Uso
### stdio (Claude Desktop / Claude Code)
```bash
usp-mcp
```
Configuração para Claude Desktop/Code (`mcpServers`):
```json
{
"mcpServers": {
"usp": {
"command": "usp-mcp"
}
}
}
```
### HTTP (FastAPI + Streamable HTTP)
```bash
usp-mcp --http --port 8000
# ou diretamente:
uvicorn usp_mcp.app:app --host 0.0.0.0 --port 8000
```
- Endpoint MCP: `http://localhost:8000/mcp`
- Health check (deste serviço e do backend): `http://localhost:8000/health`
### Variáveis de ambiente
| Variável | Efeito |
| ---------------- | ------------------------------------------------------------- |
| `HEIDY_BASE_URL` | Backend alternativo (padrão: `https://heidy-backend.fly.dev`) |
| `HEIDY_USERNAME` | Número USP para login automático na primeira ferramenta |
| `HEIDY_PASSWORD` | Senha Única para login automático |
| `HEIDY_DOWNLOAD_DIR` | Pasta padrão para `moodle_download_file` (padrão: `./downloads`) |
Sem `HEIDY_USERNAME`/`HEIDY_PASSWORD`, chame a ferramenta `usp_login`
primeiro.
## Ferramentas
| Ferramenta | O que faz |
| ------------------------------------------------ | ------------------------------------------------------------ |
| `usp_login` / `usp_logout` | Abre/encerra a sessão com número USP + Senha Única |
| `get_profile` | Perfil do estudante |
| `moodle_courses` | Disciplinas no e-Disciplinas |
| `moodle_course` | Conteúdo de uma disciplina (atividades, materiais) |
| `moodle_activity` | Abre uma atividade pelo URL (conteúdo, links, metadados de arquivo) |
| `moodle_download_file` | Baixa um arquivo do Moodle (PDF, slides, ...) para o disco (até 10 MB) |
| `usp_sync` / `usp_sync_status` / `usp_sync_history` | Sincroniza grade, notas, faltas e Moodle do JupiterWeb |
| `list_semesters` | Semestres do estudante |
| `get_schedule` | Grade horária semanal de um semestre |
| `list_enrollments` | Matrículas (turmas), com horários e professor |
| `list_grades` / `grade_summary` | Notas e média ponderada/status de aprovação por turma |
| `list_absences` / `absence_summary` | Faltas e situação frente ao limite |
| `list_tasks` / `create_task` / `update_task_status` | Tarefas do planner (provas, entregas, leituras) |
## Desenvolvimento
```bash
pip install -e .[dev]
pytest
```
Os testes cobrem o esquema de criptografia do envelope (compatível com o
vault do backend), o cliente HTTP (com backend simulado) e a superfície de
ferramentas MCP.
TDQS
Scored across 20 tools
Each tool has a distinctly clear purpose. For example, absence_summary provides a risk overview while list_absences returns individual records; moodle_activity, moodle_course, and moodle_download_file each cover different aspects of Moodle interaction. No overlapping functionality that would confuse an agent.
All tool names use a consistent lowercase_with_underscores pattern, predominantly verb_noun (list_*, create_*, get_*, update_*, moodle_*, usp_*). Even summary tools like absence_summary and grade_summary follow a predictable noun_noun pattern without deviating from the overall style.
With 20 tools covering student profile, enrollments, grades, absences, schedule, tasks, Moodle, and sync/login/logout, the count is slightly high but justifiable given the breadth of integrated USP systems. It remains manageable and each tool is focused.
The tool surface is largely complete for the domain: CRUD for tasks (create, list, status update, but missing delete and full update), read-only access to grades/absences/schedule, comprehensive Moodle interaction, and sync management. Minor gaps exist (e.g., no task deletion, no per-semester enrollment filtering), but agents can work around them.