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.
Files changed (58) hide show
  1. edu_mcp-1.0.0/.env.example +45 -0
  2. edu_mcp-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
  3. edu_mcp-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +12 -0
  4. edu_mcp-1.0.0/.github/workflows/ci.yml +30 -0
  5. edu_mcp-1.0.0/.github/workflows/publish.yml +32 -0
  6. edu_mcp-1.0.0/.gitignore +41 -0
  7. edu_mcp-1.0.0/CONTRIBUTING.md +26 -0
  8. edu_mcp-1.0.0/LICENSE +21 -0
  9. edu_mcp-1.0.0/PKG-INFO +246 -0
  10. edu_mcp-1.0.0/README.fr.md +210 -0
  11. edu_mcp-1.0.0/README.md +210 -0
  12. edu_mcp-1.0.0/SECURITY.md +20 -0
  13. edu_mcp-1.0.0/assets/logo.png +0 -0
  14. edu_mcp-1.0.0/assets/logos/ecoledirecte.png +0 -0
  15. edu_mcp-1.0.0/assets/logos/pronote.png +0 -0
  16. edu_mcp-1.0.0/assets/logos/skolengo.png +0 -0
  17. edu_mcp-1.0.0/pyproject.toml +58 -0
  18. edu_mcp-1.0.0/server.json +20 -0
  19. edu_mcp-1.0.0/src/edu_mcp/__init__.py +6 -0
  20. edu_mcp-1.0.0/src/edu_mcp/__main__.py +6 -0
  21. edu_mcp-1.0.0/src/edu_mcp/browser_auth.py +633 -0
  22. edu_mcp-1.0.0/src/edu_mcp/client.py +378 -0
  23. edu_mcp-1.0.0/src/edu_mcp/config.py +272 -0
  24. edu_mcp-1.0.0/src/edu_mcp/models.py +358 -0
  25. edu_mcp-1.0.0/src/edu_mcp/prompts/__init__.py +5 -0
  26. edu_mcp-1.0.0/src/edu_mcp/prompts/templates.py +82 -0
  27. edu_mcp-1.0.0/src/edu_mcp/providers/__init__.py +7 -0
  28. edu_mcp-1.0.0/src/edu_mcp/providers/base.py +35 -0
  29. edu_mcp-1.0.0/src/edu_mcp/providers/ecoledirecte_provider.py +311 -0
  30. edu_mcp-1.0.0/src/edu_mcp/providers/skolengo_provider.py +300 -0
  31. edu_mcp-1.0.0/src/edu_mcp/resources/__init__.py +5 -0
  32. edu_mcp-1.0.0/src/edu_mcp/resources/endpoints.py +170 -0
  33. edu_mcp-1.0.0/src/edu_mcp/server.py +65 -0
  34. edu_mcp-1.0.0/src/edu_mcp/tools/__init__.py +28 -0
  35. edu_mcp-1.0.0/src/edu_mcp/tools/academics.py +136 -0
  36. edu_mcp-1.0.0/src/edu_mcp/tools/account.py +115 -0
  37. edu_mcp-1.0.0/src/edu_mcp/tools/analytics.py +285 -0
  38. edu_mcp-1.0.0/src/edu_mcp/tools/edu_unified.py +209 -0
  39. edu_mcp-1.0.0/src/edu_mcp/tools/files.py +212 -0
  40. edu_mcp-1.0.0/src/edu_mcp/tools/grades.py +96 -0
  41. edu_mcp-1.0.0/src/edu_mcp/tools/homework.py +83 -0
  42. edu_mcp-1.0.0/src/edu_mcp/tools/messaging.py +107 -0
  43. edu_mcp-1.0.0/src/edu_mcp/tools/school_life.py +203 -0
  44. edu_mcp-1.0.0/src/edu_mcp/tools/timetable.py +33 -0
  45. edu_mcp-1.0.0/src/edu_mcp/utils.py +107 -0
  46. edu_mcp-1.0.0/src/pronote_mcp/__init__.py +5 -0
  47. edu_mcp-1.0.0/src/pronote_mcp/__main__.py +6 -0
  48. edu_mcp-1.0.0/tests/conftest.py +164 -0
  49. edu_mcp-1.0.0/tests/integration/live_smoke_test.py +48 -0
  50. edu_mcp-1.0.0/tests/unit/test_client.py +31 -0
  51. edu_mcp-1.0.0/tests/unit/test_config.py +34 -0
  52. edu_mcp-1.0.0/tests/unit/test_models.py +89 -0
  53. edu_mcp-1.0.0/tests/unit/test_new_features.py +393 -0
  54. edu_mcp-1.0.0/tests/unit/test_prompts.py +20 -0
  55. edu_mcp-1.0.0/tests/unit/test_providers.py +171 -0
  56. edu_mcp-1.0.0/tests/unit/test_resources.py +22 -0
  57. edu_mcp-1.0.0/tests/unit/test_server.py +16 -0
  58. 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
@@ -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> &nbsp;<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> &nbsp;<img src="https://img.shields.io/badge/Beta-d97706?style=flat-square" alt="Beta" /><br />
76
+ <sub>Student &amp; 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> &nbsp;<img src="https://img.shields.io/badge/Beta-d97706?style=flat-square" alt="Beta" /><br />
82
+ <sub>School search &amp; 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 &amp; 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 &amp; 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>