ipasen-mcp
Delivers action-confirmation codes to the user's Telegram chat via a bot (IPASEN_CONFIRM_MODE=telegram), so that an autonomous agent can request school-affecting actions (reporting absences, replying to teachers, signing authorizations) without ever seeing the one-time confirmation code itself.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ipasen-mcpShow me Ana's grades and absences for this term"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ipasen-mcp
Unofficial MCP server for iPasen, the school-tracking platform for families in Andalusia, Spain (Séneca, Junta de Andalucía). It lets an AI assistant (Claude Code, Claude Desktop, OpenCode, OpenClaw…) check grades, absences, timetable, school messages, trips and the school calendar, and — with explicit human confirmation — report or justify absences, answer authorizations, reply to teachers, book parent-teacher meetings, etc.
Disclaimer
This project is not affiliated with, endorsed by or supported by the Junta de Andalucía. It is an independent client written for interoperability: it uses the same public HTTPS API as the official iPasen mobile app and contains no code, keys or assets from that app. Each user logs in with their own iPasen account to access their own family's data. Use it at your own risk and responsibility, and in line with the platform's terms of use. The API may change or be blocked at any time.
Contents: Features · Installation · Usage · Actions and confirmation · Tool reference · Troubleshooting · How it works
Features
37 read-only tools: daily
overview, grades from the teacher's gradebook (with the mark of each assessment criterion), term grades, timetable, absences, school messages, upcoming events, school calendar, tutor and office hours, trip authorizations, lunch/after-school services…16 actions: report/justify absences, answer trip authorizations, sign or decline documents, reply to or write to teachers, book/cancel meetings, mark messages, manage the people allowed to pick children up. Every action is a two-step preview → confirm call.
Safe for autonomous agents: optional Telegram confirmation — the code goes to the human's phone and the agent never sees it.
Children are selected by first name (
child="Ana"); the messages the school sends once per child are merged into one.Two-factor authentication with trusted devices; several accounts (e.g. both parents) side by side.
MCP tool annotations: queries are
readOnlyHint, irreversible actionsdestructiveHint.Digest for scheduled jobs (
school_digest+mark_digested): each school message is seen once, e.g. to turn it into tasks and calendar events.OpenClaw installer that your OpenClaw agent can run by itself.
Related MCP server: EduPage MCP Server
Installation
Requirements
Python 3.10+
An iPasen family account (the username and password you use in the iPasen app)
Outbound HTTPS to
seneca.juntadeandalucia.es(andapi.telegram.orgif you use Telegram confirmation)
OpenClaw (easiest: let your agent do it)
Send this to your OpenClaw assistant:
Install the iPasen MCP for me following https://github.com/boraita/ipasen_mcp/blob/main/clients/openclaw/INSTALL.md — read it entirely before running anything, and ask me whatever you need.
It will ask for your iPasen login, whether you want actions or only queries, and (for actions) your Telegram chat id. Or run the installer yourself on the OpenClaw host:
mkdir -p ~/mcp && cd ~/mcp
curl -fsSLO https://raw.githubusercontent.com/boraita/ipasen_mcp/main/clients/openclaw/install.py
# queries only
IPASEN_USER='your_user' IPASEN_PASSWORD='your_password' python3 install.py --agent main
# queries + actions confirmed by a code sent to your Telegram
IPASEN_USER='your_user' IPASEN_PASSWORD='your_password' python3 install.py --agent main --telegram-chat-id 123456789The installer downloads the server, creates the virtualenv, stores secrets in
~/.config/ipasen-mcp/<name>/credentials.env (mode 600, never in openclaw.json), registers the
server, grants it to the agent, writes a skill with your family's data, and probes it
(39 tools read-only, 55 tools with actions). Re-run it to update. Details and options:
clients/openclaw/INSTALL.md.
Claude Code, Claude Desktop, OpenCode
1. Get the code and create a virtualenv
git clone https://github.com/boraita/ipasen_mcp.git ~/ipasen_mcp && cd ~/ipasen_mcp
python3 -m venv venv && venv/bin/pip install -r requirements.txt
# if `python3 -m venv` fails (no ensurepip, e.g. minimal Debian/Ubuntu), use uv:
# uv venv --python 3.12 venv && VIRTUAL_ENV=$PWD/venv uv pip install -r requirements.txt2. Store your credentials in a private file (keeps the password out of client configs, which get copied into backups and logs):
mkdir -p ~/.config/ipasen-mcp && chmod 700 ~/.config/ipasen-mcp
umask 077; cat > ~/.config/ipasen-mcp/credentials.env <<'EOF'
IPASEN_USER=your_user
IPASEN_PASSWORD=your_password
EOF3. Check the login
cd ~/ipasen_mcp && venv/bin/python -c "import server; print(server.login()); print(server.children())"You should see {'ok': True} and your children. If it says two_factor_required, see
Two-factor authentication.
4. Register the server in your client
Claude Code
claude mcp add ipasen-mcp -s user -- ~/ipasen_mcp/venv/bin/python ~/ipasen_mcp/server.pyClaude Desktop — claude_desktop_config.json (Settings → Developer → Edit config):
{
"mcpServers": {
"ipasen": {
"command": "/Users/YOU/ipasen_mcp/venv/bin/python",
"args": ["/Users/YOU/ipasen_mcp/server.py"]
}
}
}OpenCode — ~/.config/opencode/config.json:
"mcp": {
"ipasen": {
"type": "local",
"command": ["/home/YOU/ipasen_mcp/venv/bin/python", "/home/YOU/ipasen_mcp/server.py"],
"enabled": true
}
}Any other MCP client: stdio transport, command <repo>/venv/bin/python <repo>/server.py.
Restart the client and ask "What's new at school?".
Configuration
Settings are read from the server's environment first, then from the credentials file:
Key | Default | Purpose |
| — | iPasen login |
|
| how actions are confirmed: |
| — | bot that delivers confirmation codes ( |
| — | your Telegram chat/user id ( |
|
| where the settings above are read from |
|
| token, 2FA trust and pending confirmations (mode 600) |
Two-factor authentication
If your account uses 2FA, ask the assistant to log in: it calls login(), iPasen sends you a code,
you give it to the assistant, and it calls login(code="123456"). With the default
trust_device=True the code is not asked again on that machine.
Several accounts (e.g. both parents)
Run one server per account with its own files, and register each under a different name:
claude mcp add ipasen-partner -s user \
-e IPASEN_CREDENTIALS_FILE=$HOME/.config/ipasen-mcp/partner/credentials.env \
-e IPASEN_STATE_FILE=$HOME/.config/ipasen-mcp/partner/session.json \
-- ~/ipasen_mcp/venv/bin/python ~/ipasen_mcp/server.pyIn OpenClaw: install.py --name ipasen_partner --agent partner --deny-agent main ….
Updating and uninstalling
Update:
cd ~/ipasen_mcp && git pull && venv/bin/pip install -r requirements.txt, then restart the client. OpenClaw: re-runinstall.pywith the same options.Uninstall: remove it from the client (
claude mcp remove ipasen-mcp -s user), then delete~/ipasen_mcpand~/.config/ipasen-mcp. OpenClaw:python3 install.py --uninstall --purge.
Usage
Just talk to your assistant. Examples:
You say | The assistant uses |
"What's new at school?" |
|
"How is Ana doing in English?" |
|
"What does Pablo have on Tuesday?" |
|
"Any unread messages from school?" |
|
"When are the Christmas holidays?" |
|
"Is there any trip I need to authorize?" |
|
"When can I see the tutor?" |
|
"Tomorrow Ana has the dentist from 11 to 12, let the school know" |
|
"Reply to the tutor's message saying thanks" |
|
Tips:
Start with
childrenoroverview; every other tool takeschild="<first name>"(case/accent-insensitive) or nothing for all children.Data from the school (subjects, weekdays, absence reasons) comes in Spanish; the assistant answers in your language.
Dates for actions are
dd/mm/yyyy.
Actions and confirmation
Actions send something real to the school. Each one is called twice:
Without
confirm_code→ nothing is sent. The response is"status": "PREVIEW — nothing has been sent"with exactly what would be sent (student, dates, time slots, recipients, text).With the same arguments plus
confirm_code→ it is sent ("status": "SENT").
The code is bound to the exact request: if anything changes, it is rejected and a new preview is
needed. Invalid data (unknown id, wrong date, ambiguous recipient, two children when one is
required…) returns "REJECTED — nothing has been sent" with the reason.
Where the code comes from depends on IPASEN_CONFIRM_MODE:
Mode | The code… | Use it with |
| comes back in the preview | clients where you approve every tool call (e.g. Claude Code with permission prompts on) |
| is sent to your Telegram; the agent never sees it and must ask you for it. Random, single-use, valid 10 min, voided after 3 wrong tries | autonomous or chat agents (OpenClaw, bots), or any client where tool calls run without asking you |
⚠️ In
inlinemode an agent can confirm itself. This happened in testing: an agent previewed a message to a teacher and sent it 1.4 s later without asking. If your client does not ask you before each tool call, usetelegrammode or hide the action tools.
To enable telegram mode outside OpenClaw, add to your credentials file:
IPASEN_CONFIRM_MODE=telegram
IPASEN_TELEGRAM_BOT_TOKEN=123456:ABC... # a bot you created with @BotFather
IPASEN_TELEGRAM_CHAT_ID=123456789 # your user id; send the bot a message firstFull rules, where every id comes from, and per-action details: ACTIONS.md. Advice for keeping agents safe: CLIENTS.md.
Tool reference
Queries (read-only)
Tool | Returns |
| children with year, class group, tutor, school, enrollment |
| unread messages, events in the next 14 days, absences, latest grades, unsigned authorizations |
| gradebook activities with grade per criterion ( |
| grading periods and their grades once published |
| enrolled subjects and status |
| weekly timetable by day ( |
| absences recorded by the school / absences reported by the family |
| inbox (merged per child; |
| sent box, automatic notifications, general announcements |
| agenda (holidays, trips, exams) / official school calendar |
| class tutor, family office hours, teaching team |
| parent-teacher meetings and teachers available |
| trip/activity authorizations / details (price, dates) |
| teacher notes, behaviour incidents |
| school contact data, notice board, lunch/after-school services |
| what the name says |
| helpers to prepare actions |
| any other GET endpoint of the API |
| for scheduled jobs: messages not yet processed (full text) / record them as processed (local only, the app's read state is untouched) |
| session handling (normally automatic) |
Actions (preview → confirm)
Tool | Does | Undo |
| tell the school about an absence (whole days or some hours of one day) |
|
| delete a reported absence | — |
| justify a recorded absence, optional attachment |
|
| withdraw a justification | — |
| authorize or refuse a trip/activity | — |
| sign (PNG signature) or decline a document | — |
| write to teachers / reply to a message | — |
| read, unread, favourite, unfavourite, delete | yes, except delete |
| set tags on a message | yes |
| book a meeting in a free slot |
|
| cancel a meeting / accept or decline one proposed by a teacher | — |
| mark a teacher note read/unread | yes |
| add, update or remove a person authorized to pick up | yes |
Troubleshooting
Problem | Fix |
| create the credentials file (Installation step 2) or set |
| wrong username/password; check them in the iPasen app |
| |
| you have |
| use |
| add the token and chat id, or set |
Action says | the code expired (10 min), was used, or an argument changed: ask for a new preview |
| use a first name from |
Slow | it makes ~10 requests to Séneca; allow a 60–90 s tool timeout |
How it works
API base |
|
Login |
|
Auth |
|
2FA | if required, login returns |
Responses |
|
The older seneca/jsp/pasendroid/ API (used by 2021-era projects) is no longer what the app uses.
Known server quirks:
centros/datos-centrofails when several children attend the same school (NonUniqueResultException);school_infouses the home-screen data instead.seguimiento/get-notas-evolucionreturns 404; not exposed.The agenda only accepts
yyyy-mm-dddates after the start of the school year.mensajeria/get-conversacionesreturns the whole conversation with a sender (10 per page, oldest first);read_messagepicks the requested message from it."Administrador PASEN" notices are regenerated on every request and keep no read state.
Files
File | Purpose |
| the MCP server (FastMCP, stdio) |
| Python dependencies ( |
| action rules, where each id comes from, per-action details |
| client integration in depth, multiple accounts, keeping agents safe |
| OpenClaw installer ( |
License
MIT.
This server cannot be deployed
Maintenance
Related MCP Connectors
Connect AI assistants to Edusign attendance, courses, learners, documents, and API docs via OAuth.
Family calendars, tasks, reminders, and pickup coordination for your AI assistant.
Your household's calendar, tasks, messages and apps. Read, update, or build new apps with AI.
- UxenOAuthcom.rrrfirstchat
Your Telegram, WhatsApp, Instagram, mail and calendar in Claude or ChatGPT. Never sends messages.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceConnects AI agents to the École Directe API to access grades, homework, timetables, school life, messages, and documents.-
- AlicenseAqualityAmaintenanceEnables AI agents to query and manage EduPage school accounts, including timetables, grades, homework, meals, messages, multi-school discovery, role-aware student switching, and 2FA login.31100 PyPI4MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to look up daily and weekly Dutch school schedules from student or parent accounts, including first-class drop-off and last-class pick-up times, through natural-language questions.MIT
- AlicenseAqualityCmaintenanceEnables Claude to access school information system data such as timetables, grades, homework, messages, students, teachers, and meal information, including meal ratings.26GPL 3.0