Skip to main content
Glama
acidmole

Parenting MCP

by acidmole
README.md
# Parenting MCP

MCP-palvelin ja ajastettu WhatsApp-viestintä vanhemmille. Hakee lasten koulutiedot [Wilmasta](https://www.visma.fi/inschool/) ja lähettää automaattiset yhteenvedot WhatsAppiin.

## Ominaisuudet

### Ajastetut WhatsApp-viestit (Scheduler)

Scheduler lähettää automaattisesti kolme viestiä WhatsApp-ryhmään tai -kontaktille:

| Viesti | Oletusaika | Sisältö |
|--------|------------|---------|
| Läksykooste | 16:02 | Päivän kotitehtävät Wilmasta |
| Huomisen aikataulu | 20:03 | Huomisen koulupäivän ajat + kokeet/erikoisohjelma |
| Viikkokatsaus | su 17:57 | Ensi viikon kokeet päivittäin ryhmiteltynä |

Ajastukset ovat muokattavissa cron-syntaksilla `config.json`-tiedostossa.

### MCP-työkalut (Claude-integraatio)

Parenting MCP tarjoaa MCP-protokollan kautta 10 työkalua, joita Claude tai muu LLM voi kutsua:

**Wilma-työkalut:**
- `get_wilma_summary` — Päivittäinen yhteenveto kaikille oppilaille (aikataulu, läksyt, kokeet, viestit)
- `get_wilma_schedule` — Lukujärjestys päivälle tai viikolle
- `get_wilma_exams` — Tulevat kokeet
- `get_wilma_homework` — Kotitehtävät
- `get_wilma_news` — Koulun tiedotteet

**WhatsApp-työkalut:**
- `send_whatsapp_message` — Lähetä viesti henkilölle tai ryhmään
- `list_whatsapp_contacts` — Listaa yhteystiedot
- `list_whatsapp_groups` — Listaa ryhmät

**Yhteenvetotyökalut:**
- `send_daily_summary` — Koosta ja lähetä päivän yhteenveto WhatsAppiin
- `send_weekly_summary` — Koosta ja lähetä viikkoyhteenveto WhatsAppiin

## Asennus

```bash
npm install
npm run build
```

## Setup

Interaktiivinen setup-komento ohjaa alkuasetuksiin:

```bash
npm run setup
```

Setup tekee seuraavat asiat:

1. **WhatsApp-yhdistäminen** — Näyttää QR-koodin, jonka skannaat puhelimella (WhatsApp > Asetukset > Yhdistetyt laitteet)
2. **Kohderyhmän valinta** — Valitset WhatsApp-ryhmän tai kontaktin, johon viestit lähetetään
3. **Verkkokurssisuodattimet** — Jos oppilailla on verkkokursseja, jotka näkyvät lukujärjestyksessä mutta eivät ole lähiopetusta, ne voi suodattaa pois
4. **Ajastukset** — Viestien lähetysajat (oletus: läksyt 16:02, ilta-aikataulu 20:03, viikkokatsaus su 17:57)

Asetukset tallentuvat `config.json`-tiedostoon.

Jos WhatsApp-sessio vanhenee, ohjelma pyytää automaattisesti uuden QR-koodin — erillistä uudelleenasennusta ei tarvita.

## Konfiguraatio

`config.json` (luodaan `npm run setup` -komennolla):

```json
{
  "whatsapp": {
    "targetJid": "123456789@g.us",
    "isGroup": true,
    "targetName": "Ryhmän nimi"
  },
  "schedule": {
    "homeworkCron": "2 16 * * *",
    "eveningCron": "3 20 * * *",
    "weeklyCron": "57 17 * * 0",
    "timezone": "Europe/Helsinki"
  },
  "filters": {
    "onlineCourses": [
      {
        "studentFirstName": "Matti",
        "startTime": "07:00",
        "subjectCodePatterns": ["Ver", "verkko"]
      }
    ]
  }
}
```

| Kenttä | Kuvaus |
|--------|--------|
| `whatsapp.targetJid` | WhatsApp-ryhmän tai kontaktin JID |
| `whatsapp.isGroup` | `true` ryhmälle, `false` yksittäiselle kontaktille |
| `schedule.*Cron` | Cron-lauseke ([syntaksi](https://crontab.guru/)) |
| `filters.onlineCourses` | Suodattaa verkkokurssit pois lukujärjestyksestä nimen, alkuajan ja kurssikoodin perusteella |

## Käyttö

### Scheduler (automaattiset viestit)

```bash
npm run scheduler
```

Systemd-palveluna (käynnistyy automaattisesti kirjautuessa):

```bash
# Kopioi palvelutiedosto
cp parenting-scheduler.service ~/.config/systemd/user/
systemctl --user enable --now parenting-scheduler

# Lokit
journalctl --user -u parenting-scheduler -f
```

### Viestien manuaalinen lähetys (trigger)

Jos kone on ollut pois päältä cron-ajankohdan aikana, voit lähettää viestit jälkikäteen:

```bash
# Pysäytä scheduler (muuten kaksi WhatsApp-sessiota taistelee samasta auth_storesta)
systemctl --user stop parenting-scheduler

# Lähetä haluamasi viesti(t)
npm run trigger -- homework
npm run trigger -- evening             # huomisen aikataulu (= kuin Sun-Thu ilta-cron)
npm run trigger -- evening:today       # tämän päivän aikataulu (esim. viikonloppu-paussin jälkeen)
npm run trigger -- weekly
npm run trigger -- homework,evening    # pilkulla eroteltuna useita

# Käynnistä scheduler takaisin päälle
systemctl --user start parenting-scheduler
```

Trigger ajaa täsmälleen saman logiikan kuin cron: `homework` käyttää kuluvaa päivää, `evening` ja `weekly` huomista/ensi viikkoa.

### MCP-palvelin (Claude-integraatio)

```bash
npm run start
```

Lisää Claude Desktopin tai Claude Coden MCP-asetuksiin:

```json
{
  "mcpServers": {
    "parenting": {
      "command": "node",
      "args": ["/polku/parenting_mcp/build/index.js"]
    }
  }
}
```

## Wilma

Vaatii [wilma-cli](https://www.npmjs.com/package/@wilm-ai/wilma-cli):n, joka on asennettava ja konfiguroitava erikseen:

```bash
npm install -g @wilm-ai/wilma-cli
wilma  # Ensimmäinen kirjautuminen
```

Tukee useita Wilma-profiileja (eri koulut/vanhemmat) — scheduler hakee kaikkien profiilien oppilaat automaattisesti.

## Teknologia

- [Baileys](https://github.com/WhiskeySockets/Baileys) — WhatsApp Web API
- [wilma-cli](https://www.npmjs.com/package/@wilm-ai/wilma-cli) — Wilma-rajapinta
- [MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk) — Model Context Protocol
- [node-cron](https://www.npmjs.com/package/node-cron) — Ajastukset
- TypeScript, Node.js

## Tiedostorakenne

```
parenting_mcp/
├── src/
│   ├── index.ts              # MCP-palvelin
│   ├── scheduler.ts          # Ajastetut WhatsApp-viestit
│   ├── jobs.ts               # Jaetut työt (käyttävät scheduler + trigger)
│   ├── trigger.ts            # Manuaalinen viestien lähetys (CLI)
│   ├── setup.ts              # Interaktiivinen setup
│   ├── whatsapp-auth.ts      # WhatsApp QR-skannaus (standalone)
│   ├── services/
│   │   ├── whatsapp.ts       # WhatsApp-yhteys (Baileys)
│   │   ├── wilma.ts          # Wilma CLI -wrapper
│   │   └── config.ts         # Config-palvelu
│   └── tools/                # MCP-työkalut
├── config.json               # Asetukset (gitignored)
├── auth_store/               # WhatsApp-sessio (gitignored)
└── package.json
```

## Huomautus WhatsAppin käytöstä

Tämä ohjelma käyttää epävirallista WhatsApp Web -rajapintaa ([Baileys](https://github.com/WhiskeySockets/Baileys)), joka ei ole Metan/WhatsAppin hyväksymä tai tukema. WhatsAppin käyttöehdot saattavat kieltää epävirallisten API-rajapintojen käytön, ja tilin käyttö tällä tavalla voi johtaa tilin rajoittamiseen tai sulkemiseen. Käyttäjä on itse vastuussa ohjelman käytöstä ja mahdollisista seurauksista.