Skip to main content
Glama
README.md
# 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

B3.3/5.0

Scored across 20 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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.

Maintenance

ActivityStale
ResponsivenessUnresponsive