Yandex Calendar plugin for Hermes Agent (list/create/delete events over CalDAV).
Project description
hermes-yandex-calendar
Give Hermes Agent read/write access to your Yandex Calendar — list, create, update, respond to, move, and delete events over CalDAV, across multiple calendars, with attendee and busy/free management.
Tested against Hermes 0.19.x, Python 3.11–3.13.
What it does
Registers seven standalone tools:
| Tool | Purpose |
|---|---|
yandex_calendar_list_calendars |
List the calendars the plugin can use (name + href). |
yandex_calendar_list_events |
List events in a time range from a calendar (returns summary, start/end, location, description, attendees, busy status, and an href). |
yandex_calendar_create_event |
Create an event (summary, start, optional end/location/description/all-day, attendees, busy status, target calendar). |
yandex_calendar_update_event |
Edit an existing event by href: change fields, add/remove attendees, toggle busy/free. Recurrence rules and alarms are preserved. |
yandex_calendar_respond_event |
Respond to a meeting invitation — accept, decline, or tentatively accept. |
yandex_calendar_move_event |
Move an event to another calendar (details, attendees, recurrence, and alarms are kept). |
yandex_calendar_delete_event |
Delete an event by the href returned from a list. |
Yandex Calendar has no public REST API, so this plugin speaks CalDAV
(https://caldav.yandex.ru) directly — the same protocol Yandex's own docs point
third-party clients at.
Multiple calendars
Every tool that reads or writes events takes an optional calendar argument — a
calendar name (as returned by yandex_calendar_list_calendars) or its href.
Omit it to use the default (first) calendar. update and delete identify the
event by its href, which already encodes the calendar it lives in.
You can restrict which calendars the plugin touches with YANDEX_CALENDAR_CALENDARS
(see below); the first one in that list becomes the default.
Quick start
-
Create a Yandex app password (a normal account password will not work for CalDAV): https://id.yandex.ru/security/app-passwords → add a password scoped to "Calendar (CalDAV)".
-
Install the plugin into Hermes:
hermes plugins install akinfold/hermes-yandex-calendar --enable
-
Provide credentials — either answer the install prompts, or add them to
~/.hermes/.env:YANDEX_CALENDAR_LOGIN=you@yandex.ru YANDEX_CALENDAR_APP_PASSWORD=xxxxxxxxxxxxxxxx
-
Enable it in
~/.hermes/config.yaml(third-party plugins are off by default):plugins: enabled: [yandex_calendar]
That's it — ask the agent things like "what's on my calendar next week?" or "add a 30-minute call tomorrow at 3pm".
Configuration
| Env var | Required | Default | Meaning |
|---|---|---|---|
YANDEX_CALENDAR_LOGIN |
yes | — | Yandex login / email. |
YANDEX_CALENDAR_APP_PASSWORD |
yes | — | App password for CalDAV (see step 1). |
YANDEX_CALENDAR_BASE_URL |
no | https://caldav.yandex.ru |
Override for self-hosted / testing. |
YANDEX_CALENDAR_CALENDARS |
no | (all) | Comma-separated allow-list of calendar names the plugin may use, e.g. Work,Personal. The first is the default calendar. |
Credentials are read from the environment first, then from ~/.hermes/.env, so they
work in gateway and subprocess runs. Secret values are never logged.
Dates and times are ISO 8601 (2026-07-25 or 2026-07-25T14:00:00+03:00); a datetime
without an offset is treated as UTC.
Install alternatives
- pip (discovered via the
hermes_agent.pluginsentry point):pip install hermes-yandex-calendar
then addyandex_calendartoplugins.enabled. - Drop-in: unzip the release archive into
~/.hermes/plugins/so you get~/.hermes/plugins/yandex_calendar/plugin.yaml, then enable it.
Development
python -m venv .venv && source .venv/bin/activate
pip install -e '.[dev]'
ruff check . && ruff format --check .
pytest # unit tests (no network)
Live end-to-end tests hit a real account and are deselected by default. They create then delete a throwaway event far in the future, so a successful run leaves no residue:
YANDEX_CALENDAR_LOGIN=you@yandex.ru \
YANDEX_CALENDAR_APP_PASSWORD=xxxx \
pytest -m e2e
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hermes_yandex_calendar-0.1.0.tar.gz.
File metadata
- Download URL: hermes_yandex_calendar-0.1.0.tar.gz
- Upload date:
- Size: 30.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
862a75df9a7f25508251cd6479d11d83d9443923c46ffa32d0415a097bea9309
|
|
| MD5 |
890842c6e1c65bdac7083235cdd24951
|
|
| BLAKE2b-256 |
6311a4849ff35229bb7bce7451502447ffaaf7fe01dd571fae7ece170daf7024
|
Provenance
The following attestation bundles were made for hermes_yandex_calendar-0.1.0.tar.gz:
Publisher:
release-publish.yml on akinfold/hermes-yandex-calendar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_yandex_calendar-0.1.0.tar.gz -
Subject digest:
862a75df9a7f25508251cd6479d11d83d9443923c46ffa32d0415a097bea9309 - Sigstore transparency entry: 2254866236
- Sigstore integration time:
-
Permalink:
akinfold/hermes-yandex-calendar@58e7ff9c1c7ef61dc4416b4785b5a1da36839b1b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/akinfold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-publish.yml@58e7ff9c1c7ef61dc4416b4785b5a1da36839b1b -
Trigger Event:
push
-
Statement type:
File details
Details for the file hermes_yandex_calendar-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hermes_yandex_calendar-0.1.0-py3-none-any.whl
- Upload date:
- Size: 21.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc684afb8da5692b1cd1bddef2d03240e9f2de108c67c66cff8eaeb58cd92eb9
|
|
| MD5 |
431a5f588d8983e774a0cb074bbc508a
|
|
| BLAKE2b-256 |
1cca9b642b478c509b6ed6592cf6b12a5144a4c20b60973ab5cb79d858a063ea
|
Provenance
The following attestation bundles were made for hermes_yandex_calendar-0.1.0-py3-none-any.whl:
Publisher:
release-publish.yml on akinfold/hermes-yandex-calendar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_yandex_calendar-0.1.0-py3-none-any.whl -
Subject digest:
cc684afb8da5692b1cd1bddef2d03240e9f2de108c67c66cff8eaeb58cd92eb9 - Sigstore transparency entry: 2254866349
- Sigstore integration time:
-
Permalink:
akinfold/hermes-yandex-calendar@58e7ff9c1c7ef61dc4416b4785b5a1da36839b1b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/akinfold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-publish.yml@58e7ff9c1c7ef61dc4416b4785b5a1da36839b1b -
Trigger Event:
push
-
Statement type: