edu-mcp 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edu_mcp-1.0.0/.env.example +45 -0
- edu_mcp-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
- edu_mcp-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +12 -0
- edu_mcp-1.0.0/.github/workflows/ci.yml +30 -0
- edu_mcp-1.0.0/.github/workflows/publish.yml +32 -0
- edu_mcp-1.0.0/.gitignore +41 -0
- edu_mcp-1.0.0/CONTRIBUTING.md +26 -0
- edu_mcp-1.0.0/LICENSE +21 -0
- edu_mcp-1.0.0/PKG-INFO +246 -0
- edu_mcp-1.0.0/README.fr.md +210 -0
- edu_mcp-1.0.0/README.md +210 -0
- edu_mcp-1.0.0/SECURITY.md +20 -0
- edu_mcp-1.0.0/assets/logo.png +0 -0
- edu_mcp-1.0.0/assets/logos/ecoledirecte.png +0 -0
- edu_mcp-1.0.0/assets/logos/pronote.png +0 -0
- edu_mcp-1.0.0/assets/logos/skolengo.png +0 -0
- edu_mcp-1.0.0/pyproject.toml +58 -0
- edu_mcp-1.0.0/server.json +20 -0
- edu_mcp-1.0.0/src/edu_mcp/__init__.py +6 -0
- edu_mcp-1.0.0/src/edu_mcp/__main__.py +6 -0
- edu_mcp-1.0.0/src/edu_mcp/browser_auth.py +633 -0
- edu_mcp-1.0.0/src/edu_mcp/client.py +378 -0
- edu_mcp-1.0.0/src/edu_mcp/config.py +272 -0
- edu_mcp-1.0.0/src/edu_mcp/models.py +358 -0
- edu_mcp-1.0.0/src/edu_mcp/prompts/__init__.py +5 -0
- edu_mcp-1.0.0/src/edu_mcp/prompts/templates.py +82 -0
- edu_mcp-1.0.0/src/edu_mcp/providers/__init__.py +7 -0
- edu_mcp-1.0.0/src/edu_mcp/providers/base.py +35 -0
- edu_mcp-1.0.0/src/edu_mcp/providers/ecoledirecte_provider.py +311 -0
- edu_mcp-1.0.0/src/edu_mcp/providers/skolengo_provider.py +300 -0
- edu_mcp-1.0.0/src/edu_mcp/resources/__init__.py +5 -0
- edu_mcp-1.0.0/src/edu_mcp/resources/endpoints.py +170 -0
- edu_mcp-1.0.0/src/edu_mcp/server.py +65 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/__init__.py +28 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/academics.py +136 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/account.py +115 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/analytics.py +285 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/edu_unified.py +209 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/files.py +212 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/grades.py +96 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/homework.py +83 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/messaging.py +107 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/school_life.py +203 -0
- edu_mcp-1.0.0/src/edu_mcp/tools/timetable.py +33 -0
- edu_mcp-1.0.0/src/edu_mcp/utils.py +107 -0
- edu_mcp-1.0.0/src/pronote_mcp/__init__.py +5 -0
- edu_mcp-1.0.0/src/pronote_mcp/__main__.py +6 -0
- edu_mcp-1.0.0/tests/conftest.py +164 -0
- edu_mcp-1.0.0/tests/integration/live_smoke_test.py +48 -0
- edu_mcp-1.0.0/tests/unit/test_client.py +31 -0
- edu_mcp-1.0.0/tests/unit/test_config.py +34 -0
- edu_mcp-1.0.0/tests/unit/test_models.py +89 -0
- edu_mcp-1.0.0/tests/unit/test_new_features.py +393 -0
- edu_mcp-1.0.0/tests/unit/test_prompts.py +20 -0
- edu_mcp-1.0.0/tests/unit/test_providers.py +171 -0
- edu_mcp-1.0.0/tests/unit/test_resources.py +22 -0
- edu_mcp-1.0.0/tests/unit/test_server.py +16 -0
- edu_mcp-1.0.0/tests/unit/test_tools.py +59 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Configuration Edu MCP Server
|
|
2
|
+
# ================================
|
|
3
|
+
|
|
4
|
+
# Plateforme : "pronote" (défaut), "ecoledirecte" ou "skolengo"
|
|
5
|
+
EDU_PLATFORM=pronote
|
|
6
|
+
|
|
7
|
+
# Option A : Connexion Pronote (+ ENT) avec identifiant / mot de passe ou navigateur SSO
|
|
8
|
+
PRONOTE_URL=https://demo.pronote.index-education.net/pronote/eleve.html
|
|
9
|
+
PRONOTE_USERNAME=demonstration
|
|
10
|
+
PRONOTE_PASSWORD=demonstration
|
|
11
|
+
|
|
12
|
+
# Type de compte : "student" (élève, défaut) ou "parent"
|
|
13
|
+
PRONOTE_ACCOUNT_TYPE=student
|
|
14
|
+
|
|
15
|
+
# Nom de l'ENT si applicable (ex: ile_de_france, monbureaunumerique, toutatice, atrium_sud, etc.)
|
|
16
|
+
PRONOTE_ENT=
|
|
17
|
+
|
|
18
|
+
# Code PIN 2FA / Nom de l'appareil
|
|
19
|
+
PRONOTE_ACCOUNT_PIN=0000
|
|
20
|
+
PRONOTE_DEVICE_NAME=Mon Appareil MCP
|
|
21
|
+
|
|
22
|
+
# Fichier de cache de session (défaut : ~/.edu_mcp/.session_cache.pkl)
|
|
23
|
+
# PRONOTE_SESSION_FILE=.session_cache.pkl
|
|
24
|
+
|
|
25
|
+
# Option B : Authentification Pronote par Token / QR-Code (généré automatiquement)
|
|
26
|
+
# PRONOTE_TOKEN=votre_token_64_chars
|
|
27
|
+
# PRONOTE_UUID=votre_uuid
|
|
28
|
+
|
|
29
|
+
# Option C : ÉcoleDirecte (jetons appareil de confiance QCM 2FA)
|
|
30
|
+
# EDU_ED_CN=
|
|
31
|
+
# EDU_ED_CV=
|
|
32
|
+
|
|
33
|
+
# Option D : Skolengo (OAuth2 PKCE)
|
|
34
|
+
# EDU_SKOLENGO_TOKEN=
|
|
35
|
+
# EDU_SKOLENGO_REFRESH_TOKEN=
|
|
36
|
+
# EDU_SKOLENGO_SCHOOL_ID=
|
|
37
|
+
# EDU_SKOLENGO_EMS_CODE=
|
|
38
|
+
# EDU_SKOLENGO_OIDC_URL=
|
|
39
|
+
|
|
40
|
+
# Pour un compte parent avec plusieurs enfants
|
|
41
|
+
# PRONOTE_CHILD_NAME=Alexandre
|
|
42
|
+
|
|
43
|
+
PRONOTE_CACHE_TTL=180
|
|
44
|
+
PRONOTE_TIMEOUT=30
|
|
45
|
+
PRONOTE_DOWNLOAD_DIR=./downloads
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a bug or connection issue
|
|
4
|
+
title: "[Bug]: "
|
|
5
|
+
labels: bug
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Platform**
|
|
9
|
+
- [ ] Pronote (+ ENT)
|
|
10
|
+
- [ ] ÉcoleDirecte
|
|
11
|
+
- [ ] Skolengo
|
|
12
|
+
|
|
13
|
+
**Environment**
|
|
14
|
+
- OS: (e.g. Windows 11, macOS, Ubuntu)
|
|
15
|
+
- Python version:
|
|
16
|
+
- MCP Client: (Antigravity, Claude Desktop, Cursor, Windsurf, VS Code)
|
|
17
|
+
|
|
18
|
+
**Describe the bug**
|
|
19
|
+
A clear and concise description of what happened.
|
|
20
|
+
|
|
21
|
+
**Steps to reproduce**
|
|
22
|
+
1. ...
|
|
23
|
+
2. ...
|
|
24
|
+
|
|
25
|
+
**Sanitized logs**
|
|
26
|
+
> Please remove any personal URLs, usernames, tokens, or PINs before pasting logs.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature or Platform Request
|
|
3
|
+
about: Suggest a new school platform, ENT connector, or MCP tool
|
|
4
|
+
title: "[Feature]: "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Platform / Feature**
|
|
9
|
+
Which platform or capability would you like to see supported?
|
|
10
|
+
|
|
11
|
+
**Use case**
|
|
12
|
+
Describe how you would use this in your AI assistant.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
|
|
24
|
+
- name: Install package and dev dependencies
|
|
25
|
+
run: |
|
|
26
|
+
python -m pip install --upgrade pip
|
|
27
|
+
pip install -e ".[dev]"
|
|
28
|
+
|
|
29
|
+
- name: Run unit tests
|
|
30
|
+
run: pytest tests/unit -v --cov-fail-under=0
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
pypi-publish:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment:
|
|
12
|
+
name: pypi
|
|
13
|
+
url: https://pypi.org/p/edu-mcp
|
|
14
|
+
permissions:
|
|
15
|
+
id-token: write
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
|
|
25
|
+
- name: Install build
|
|
26
|
+
run: python -m pip install build
|
|
27
|
+
|
|
28
|
+
- name: Build sdist and wheel
|
|
29
|
+
run: python -m build
|
|
30
|
+
|
|
31
|
+
- name: Publish package to PyPI
|
|
32
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
edu_mcp-1.0.0/.gitignore
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
env/
|
|
8
|
+
venv/
|
|
9
|
+
ENV/
|
|
10
|
+
build/
|
|
11
|
+
develop-eggs/
|
|
12
|
+
dist/
|
|
13
|
+
downloads/
|
|
14
|
+
eggs/
|
|
15
|
+
.eggs/
|
|
16
|
+
lib/
|
|
17
|
+
lib64/
|
|
18
|
+
parts/
|
|
19
|
+
sdist/
|
|
20
|
+
var/
|
|
21
|
+
wheels/
|
|
22
|
+
*.egg-info/
|
|
23
|
+
.installed.cfg
|
|
24
|
+
*.egg
|
|
25
|
+
|
|
26
|
+
# Secrets & Sessions
|
|
27
|
+
.env
|
|
28
|
+
.env.test
|
|
29
|
+
profiles/
|
|
30
|
+
switch_account.py
|
|
31
|
+
switch_to_*.bat
|
|
32
|
+
sso_debug.log
|
|
33
|
+
*.pkl
|
|
34
|
+
.session_cache.pkl
|
|
35
|
+
.device_uuid
|
|
36
|
+
|
|
37
|
+
# Testing & Debug
|
|
38
|
+
.pytest_cache/
|
|
39
|
+
.playwright-mcp/
|
|
40
|
+
.coverage
|
|
41
|
+
htmlcov/
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Contributing to Edu MCP
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to **Edu MCP**!
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/jujukingg/edu-mcp.git
|
|
9
|
+
cd edu-mcp
|
|
10
|
+
pip install -e ".[dev]"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Running Tests
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pytest tests/unit -v --cov-fail-under=0
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Adding or Improving a Platform Provider
|
|
20
|
+
|
|
21
|
+
All school platform providers live under `src/edu_mcp/providers/` and implement the `SchoolProvider` protocol in `src/edu_mcp/providers/base.py`, returning the shared immutable Pydantic DTOs from `src/edu_mcp/models.py`.
|
|
22
|
+
|
|
23
|
+
1. Keep credentials out of logs and error messages.
|
|
24
|
+
2. Add unit tests with mocked HTTP/client responses in `tests/unit/test_providers.py` (never commit real `.env` files or tokens).
|
|
25
|
+
3. Update `README.md` and `README.fr.md` if you add new environment variables or tools.
|
|
26
|
+
4. Use [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, `test:`, `chore:`).
|
edu_mcp-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pronote MCP Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
edu_mcp-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: edu-mcp
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Unified Model Context Protocol (MCP) server for French school platforms (Pronote, ÉcoleDirecte, Skolengo, ENT).
|
|
5
|
+
Project-URL: Homepage, https://github.com/jujukingg/edu-mcp
|
|
6
|
+
Project-URL: Repository, https://github.com/jujukingg/edu-mcp
|
|
7
|
+
Project-URL: Issues, https://github.com/jujukingg/edu-mcp/issues
|
|
8
|
+
Author: Edu MCP Contributors
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ecoledirecte,education,mcp,pronote,school,skolengo
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Intended Audience :: Education
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Requires-Dist: ecoledirecte-py-client>=0.2.1
|
|
21
|
+
Requires-Dist: httpx>=0.28.0
|
|
22
|
+
Requires-Dist: mcp>=2.0.0
|
|
23
|
+
Requires-Dist: opencv-python-headless>=4.8.0
|
|
24
|
+
Requires-Dist: playwright>=1.40.0
|
|
25
|
+
Requires-Dist: pronotepy>=2.11.0
|
|
26
|
+
Requires-Dist: pydantic-settings>=2.2.0
|
|
27
|
+
Requires-Dist: pydantic>=2.7.0
|
|
28
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
29
|
+
Requires-Dist: truststore>=0.10.0
|
|
30
|
+
Provides-Extra: dev
|
|
31
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-mock>=3.12.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
<div align="center">
|
|
38
|
+
|
|
39
|
+
<img src="assets/logo.png" alt="Edu MCP" width="112" />
|
|
40
|
+
|
|
41
|
+
<h1>Edu MCP</h1>
|
|
42
|
+
|
|
43
|
+
<p>
|
|
44
|
+
<strong>The unified Model Context Protocol server for French school platforms.</strong><br />
|
|
45
|
+
Connect <strong>Pronote (+ ENT)</strong>, <strong>ÉcoleDirecte</strong>, and <strong>Skolengo</strong> to your AI assistant in seconds.
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
<p>
|
|
49
|
+
<a href="README.md"><strong>English</strong></a> · <a href="README.fr.md">Français</a>
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
<p>
|
|
53
|
+
<a href="https://github.com/jujukingg/edu-mcp/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/jujukingg/edu-mcp/ci.yml?style=flat-square&logo=github&label=CI" alt="CI" /></a>
|
|
54
|
+
<a href="https://pypi.org/project/edu-mcp/"><img src="https://img.shields.io/badge/PyPI-edu--mcp-3775A9?style=flat-square&logo=pypi&logoColor=white" alt="PyPI" /></a>
|
|
55
|
+
<img src="https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.10+" />
|
|
56
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-16a34a?style=flat-square" alt="MIT License" /></a>
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Supported Platforms
|
|
64
|
+
|
|
65
|
+
<table>
|
|
66
|
+
<tr>
|
|
67
|
+
<td align="center" width="33%">
|
|
68
|
+
<img src="assets/logos/pronote.png" alt="Pronote" height="44" /><br /><br />
|
|
69
|
+
<strong>Pronote (+ ENT)</strong> <img src="https://img.shields.io/badge/Stable-16a34a?style=flat-square" alt="Stable" /><br />
|
|
70
|
+
<sub>Toutatice, MonBureauNumérique, Île-de-France, Atrium…</sub><br /><br />
|
|
71
|
+
<code>Browser SSO + 2FA + QR Token</code>
|
|
72
|
+
</td>
|
|
73
|
+
<td align="center" width="33%">
|
|
74
|
+
<img src="assets/logos/ecoledirecte.png" alt="ÉcoleDirecte" height="44" /><br /><br />
|
|
75
|
+
<strong>ÉcoleDirecte</strong> <img src="https://img.shields.io/badge/Beta-d97706?style=flat-square" alt="Beta" /><br />
|
|
76
|
+
<sub>Student & Family multi-child spaces</sub><br /><br />
|
|
77
|
+
<code>Credentials + QCM 2FA</code>
|
|
78
|
+
</td>
|
|
79
|
+
<td align="center" width="33%">
|
|
80
|
+
<img src="assets/logos/skolengo.png" alt="Skolengo" height="44" /><br /><br />
|
|
81
|
+
<strong>Skolengo</strong> <img src="https://img.shields.io/badge/Beta-d97706?style=flat-square" alt="Beta" /><br />
|
|
82
|
+
<sub>School search & federated ENT login</sub><br /><br />
|
|
83
|
+
<code>OAuth2 PKCE Browser</code>
|
|
84
|
+
</td>
|
|
85
|
+
</tr>
|
|
86
|
+
</table>
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## How It Works
|
|
91
|
+
|
|
92
|
+
```mermaid
|
|
93
|
+
flowchart LR
|
|
94
|
+
AI["AI Assistant<br/>Antigravity · Claude · Cursor · Windsurf"] <-->|MCP stdio| Server["Edu MCP<br/>(uvx edu-mcp)"]
|
|
95
|
+
Server --> P1["Pronote (+ ENT)"]
|
|
96
|
+
Server --> P2["ÉcoleDirecte"]
|
|
97
|
+
Server --> P3["Skolengo"]
|
|
98
|
+
Server --- Store[("~/.edu_mcp/.env (0600)<br/>Session Cache & Device UUID")]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
> [!IMPORTANT]
|
|
102
|
+
> **Privacy & Security by Design**
|
|
103
|
+
> - **Zero-leak login**: Pronote & Skolengo authenticate directly in your native browser — passwords never enter the chat.
|
|
104
|
+
> - **Read-only messaging**: Your AI can read school announcements and discussion threads, never send messages.
|
|
105
|
+
> - **Local-only storage**: Tokens and session caches stay on your machine in `~/.edu_mcp/.env` (`chmod 600`).
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Quick Start
|
|
110
|
+
|
|
111
|
+
### 1. Add to Your AI Client
|
|
112
|
+
|
|
113
|
+
Paste this into your MCP configuration file — no cloning or manual Python setup required:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"mcpServers": {
|
|
118
|
+
"edu-mcp": {
|
|
119
|
+
"command": "uvx",
|
|
120
|
+
"args": ["edu-mcp"]
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
<details>
|
|
127
|
+
<summary><strong>Where is my MCP config file?</strong> (Antigravity, Claude Desktop, Cursor, Windsurf, VS Code)</summary>
|
|
128
|
+
|
|
129
|
+
| Client | Configuration Path |
|
|
130
|
+
|---|---|
|
|
131
|
+
| **Antigravity** | `~/.gemini/config/mcp_config.json` |
|
|
132
|
+
| **Claude Desktop (macOS)** | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
133
|
+
| **Claude Desktop (Windows)** | `%APPDATA%\Claude\claude_desktop_config.json` |
|
|
134
|
+
| **Cursor** | `~/.cursor/mcp.json` or `.cursor/mcp.json` |
|
|
135
|
+
| **Windsurf** | `~/.codeium/windsurf/mcp_config.json` |
|
|
136
|
+
| **VS Code (Copilot)** | `.vscode/mcp.json` |
|
|
137
|
+
|
|
138
|
+
</details>
|
|
139
|
+
|
|
140
|
+
<details>
|
|
141
|
+
<summary><strong>Alternative:</strong> Run via <code>pip</code> or from a local git clone</summary>
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
pip install edu-mcp
|
|
145
|
+
edu-mcp
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Or from a cloned repository:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"mcpServers": {
|
|
153
|
+
"edu-mcp": {
|
|
154
|
+
"command": "python",
|
|
155
|
+
"args": ["-m", "edu_mcp"],
|
|
156
|
+
"cwd": "/path/to/edu-mcp"
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
</details>
|
|
163
|
+
|
|
164
|
+
### 2. Connect in Chat
|
|
165
|
+
|
|
166
|
+
Just ask your assistant:
|
|
167
|
+
|
|
168
|
+
> *"Connect my Pronote / ÉcoleDirecte / Skolengo account"*
|
|
169
|
+
|
|
170
|
+
1. The assistant calls `edu_setup_account` and guides you through the exact flow for your platform.
|
|
171
|
+
2. **Pronote / Skolengo**: your browser opens on the official login page; sign in normally (ENT + 2FA) and your durable token is captured automatically.
|
|
172
|
+
3. **ÉcoleDirecte**: sign in once with QCM 2FA verification; trusted device tokens (`cn`/`cv`) are saved for future sessions.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Capabilities
|
|
177
|
+
|
|
178
|
+
| Category | What Your Assistant Can Do |
|
|
179
|
+
|---|---|
|
|
180
|
+
| **Schedule** | Fetch daily/weekly timetables, room changes, cancellations, and lesson content; export `.ics` or `.pdf`. |
|
|
181
|
+
| **Homework** | List upcoming assignments with attachments and mark homework as done/pending. |
|
|
182
|
+
| **Grades & Analytics** | Read grades, subject & class averages, skill evaluations, report cards, simulate grades, and track progression. |
|
|
183
|
+
| **School Life** | Check absences, delays, punishments, canteen menus, and school news. |
|
|
184
|
+
| **Messaging** | Read unread threads and announcements *(strictly read-only)*. |
|
|
185
|
+
| **Parent Mode** | List linked children and switch active child seamlessly. |
|
|
186
|
+
|
|
187
|
+
<details>
|
|
188
|
+
<summary><strong>Full MCP Tool, Resource & Prompt Reference</strong> (25+ tools)</summary>
|
|
189
|
+
|
|
190
|
+
### Unified Multi-Platform Tools (`edu_*`)
|
|
191
|
+
|
|
192
|
+
| Tool | Description |
|
|
193
|
+
|---|---|
|
|
194
|
+
| `edu_list_platforms` | List supported platforms and search Skolengo schools. |
|
|
195
|
+
| `edu_setup_account` | Chat-guided setup for Pronote, ÉcoleDirecte, or Skolengo. |
|
|
196
|
+
| `edu_get_user_info` | Active user profile (name, class, school, account type). |
|
|
197
|
+
| `edu_get_timetable` | Timetable lessons for a date range. |
|
|
198
|
+
| `edu_get_homework` / `edu_set_homework_done` | Homework list and completion toggle. |
|
|
199
|
+
| `edu_get_grades` / `edu_get_averages` | Individual grades and subject/class averages. |
|
|
200
|
+
| `edu_get_absences` | Absences, delays, and punishments. |
|
|
201
|
+
| `edu_get_news` | School announcements and news items. |
|
|
202
|
+
| `edu_get_discussions` / `edu_get_discussion_messages` | Read-only messaging threads and messages. |
|
|
203
|
+
| `edu_list_children` / `edu_select_child` | Multi-child switching for parent accounts. |
|
|
204
|
+
|
|
205
|
+
> **Pronote-specific & Analytics tools** (`pronote_weekly_radar`, `pronote_simulate_grade`, `pronote_analyze_progression`, `pronote_get_evaluations`, `pronote_get_report`, `pronote_get_canteen_menu`, `pronote_export_ical`, `pronote_export_timetable_pdf`, `pronote_download_attachment`) are also registered.
|
|
206
|
+
|
|
207
|
+
### Resources & Prompts
|
|
208
|
+
|
|
209
|
+
- **Resources**: `pronote://student/profile`, `pronote://timetable/today`, `pronote://homework/pending`, `pronote://grades/overview`, `pronote://messages/unread`, `pronote://academics/weekly-radar`
|
|
210
|
+
- **Prompts**: `pronote_daily_briefing`, `pronote_homework_planner`, `pronote_period_review`
|
|
211
|
+
|
|
212
|
+
</details>
|
|
213
|
+
|
|
214
|
+
<details>
|
|
215
|
+
<summary><strong>Environment Variables</strong> (resolved from <code>PRONOTE_ENV_FILE</code>, <code>~/.edu_mcp/.env</code>, or local <code>.env</code>)</summary>
|
|
216
|
+
|
|
217
|
+
| Variable | Description |
|
|
218
|
+
|---|---|
|
|
219
|
+
| `EDU_PLATFORM` | Active platform: `pronote`, `ecoledirecte`, or `skolengo`. |
|
|
220
|
+
| `PRONOTE_MCP_HOME` | Custom directory for `.env`, session cache, and logs (default: `~/.edu_mcp`). |
|
|
221
|
+
| `PRONOTE_ENV_FILE` | Explicit path to a `.env` file. |
|
|
222
|
+
| `PRONOTE_URL` | Full Pronote web space URL (`eleve.html` or `parent.html`). |
|
|
223
|
+
| `PRONOTE_USERNAME` / `PRONOTE_TOKEN` | Username and durable token (auto-generated). |
|
|
224
|
+
| `PRONOTE_ACCOUNT_PIN` | Optional 4-digit 2FA PIN. |
|
|
225
|
+
| `EDU_ED_CN` / `EDU_ED_CV` | ÉcoleDirecte trusted 2FA device tokens. |
|
|
226
|
+
| `EDU_SKOLENGO_TOKEN` / `EDU_SKOLENGO_REFRESH_TOKEN` | Skolengo OAuth2 tokens. |
|
|
227
|
+
| `PRONOTE_DOWNLOAD_DIR` | Directory for downloaded attachments and exports (default: `./downloads`). |
|
|
228
|
+
|
|
229
|
+
</details>
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Development
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
git clone https://github.com/jujukingg/edu-mcp.git
|
|
237
|
+
cd edu-mcp
|
|
238
|
+
pip install -e ".[dev]"
|
|
239
|
+
pytest tests/unit -v
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
<p align="center">
|
|
245
|
+
Released under the <a href="LICENSE">MIT License</a>.
|
|
246
|
+
</p>
|