From radicale
Manages calendars and contacts on self-hosted Radicale CalDAV/CardDAV server: list, view, create, update, delete events and contacts via Python caldav CLI script.
npx claudepluginhub jmagar/claude-homelabThis skill uses the workspace's default tool permissions.
**⚠️ MANDATORY SKILL INVOCATION ⚠️**
Manages calendars and contacts on self-hosted Radicale CalDAV/CardDAV server. List, create, update, delete events and contacts using Python caldav library.
Syncs CalDAV calendars (iCloud, Google, Fastmail, Nextcloud) to local files with vdirsyncer and manages events (list, search, create, edit, delete) using khal on Linux.
Adds Google Calendar (gog CLI with OAuth) and CalDAV (iCloud, Nextcloud, Fastmail via cal CLI) access to NanoTars by guiding authentication and configuring environment variables.
Share bugs, ideas, or general feedback.
⚠️ MANDATORY SKILL INVOCATION ⚠️
YOU MUST invoke this skill (NOT optional) when the user mentions ANY of these triggers:
Failure to invoke this skill when triggers occur violates your operational requirements.
Manage calendars (events) and contacts on a self-hosted Radicale server using CalDAV and CardDAV protocols.
Type: Read & Write (calendar events and contacts)
This skill enables comprehensive calendar and contact management through a self-hosted Radicale server. It provides read and write access to:
All operations use the Python caldav library which implements the CalDAV (RFC 4791) and CardDAV (RFC 6352) protocols.
Install required Python libraries:
pip install caldav vobject icalendar
Script Permissions:
The Python script can be made executable (optional but recommended):
chmod +x ~/claude-homelab/skills/radicale/scripts/radicale-api.py
You can then run it directly:
./scripts/radicale-api.py --help
Or without executable permissions using Python:
python scripts/radicale-api.py --help
Add to ~/.claude-homelab/.env:
RADICALE_URL="http://localhost:5232"
RADICALE_USERNAME="admin"
RADICALE_PASSWORD="password"
Security:
.env file is gitignored (never commit credentials)chmod 600 ~/.claude-homelab/.envAll operations use the scripts/radicale-api.py wrapper script. Output is JSON format for easy parsing.
python scripts/radicale-api.py calendars list
Returns array of calendars with name, URL, and ID.
List events in a calendar within a date range:
python scripts/radicale-api.py events list \
--calendar "Personal" \
--start "2026-02-08" \
--end "2026-02-15"
Parameters:
--calendar (required) - Calendar name (case-sensitive)--start (optional) - Start date (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS)--end (optional) - End date (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS)Default behavior: If start/end not specified, uses current date + 7 days.
Returns array of events with UID, summary, description, location, start, end, and timestamps.
python scripts/radicale-api.py events create \
--calendar "Personal" \
--title "Meeting" \
--start "2026-02-10T14:00:00" \
--end "2026-02-10T15:00:00" \
--location "Conference Room" \
--description "Team sync"
Required parameters:
--calendar - Calendar name--title - Event title/summary--start - Start datetime (YYYY-MM-DDTHH:MM:SS)--end - End datetime (YYYY-MM-DDTHH:MM:SS)Optional parameters:
--location - Event location--description - Event descriptionImportant: Use ISO 8601 datetime format (YYYY-MM-DDTHH:MM:SS). End must be after start.
python scripts/radicale-api.py events delete \
--calendar "Personal" \
--uid "event-uid-here"
Get UID from events list output.
python scripts/radicale-api.py contacts addressbooks
Returns array of addressbooks with name, URL, and ID.
python scripts/radicale-api.py contacts list \
--addressbook "Contacts"
Returns array of contacts with UID, name, email, and phone.
python scripts/radicale-api.py contacts search \
--addressbook "Contacts" \
--query "David"
Search behavior: Case-insensitive substring match against name and email fields.
python scripts/radicale-api.py contacts create \
--addressbook "Contacts" \
--name "John Doe" \
--email "john@example.com" \
--phone "+1-555-1234"
Required parameter:
--name - Contact full nameOptional parameters:
--email - Email address--phone - Phone numberpython scripts/radicale-api.py contacts delete \
--addressbook "Contacts" \
--uid "contact-uid-here"
Get UID from contacts list or contacts search output.
When users make natural language requests, translate them to script commands:
User: "What's my calendar look like this week?"
Action:
python scripts/radicale-api.py events list --calendar "Personal" --start "YYYY-MM-DD" --end "YYYY-MM-DD"User: "Add to my calendar Billy Strings in Athens, GA 02/07/2026 7PM EST"
Action:
python scripts/radicale-api.py events create --calendar "Personal" --title "Billy Strings" --start "2026-02-07T19:00:00" --end "2026-02-07T23:00:00" --location "Athens, GA"User: "What's David Ryan's work email?"
Action:
python scripts/radicale-api.py contacts search --addressbook "Contacts" --query "David Ryan"User: "Add John Doe to my contacts, email john@example.com"
Action:
python scripts/radicale-api.py contacts create --addressbook "Contacts" --name "John Doe" --email "john@example.com"When user mentions calendars or contacts:
Determine operation type:
events listevents createevents deletecontacts searchcontacts createcontacts deleteIdentify target:
Extract parameters:
Execute command:
Present results:
Important considerations:
YYYY-MM-DDTHH:MM:SSCommon translations:
Complete Python wrapper for CalDAV/CardDAV operations. Uses caldav library to connect to Radicale server and perform all calendar/contact operations.
Key features:
.env fileDirect usage: Can be called directly with command-line arguments (see examples above).
In-depth guide to the Python caldav library including:
When to reference: When implementing custom operations beyond the wrapper script, or when debugging library-specific issues.
Quick command examples for all operations with sample inputs and outputs.
When to reference: When user needs examples or when uncertain about command syntax.
Common errors and solutions including:
When to reference: When operations fail or user reports errors.
All operations return JSON with status. Check for:
Connection errors:
ERROR: .env file not found → Guide user to create .env fileERROR: Failed to connect to Radicale → Check Radicale is running, verify URLERROR: Authentication failed → Verify credentials in .envResource errors:
ERROR: Calendar 'X' not found → List available calendars with calendars listERROR: Addressbook 'X' not found → List addressbooks with contacts addressbooksData errors:
ValueError: Invalid isoformat string → Fix datetime format to ISO 8601Read-Write Operations:
Performance:
Limitations:
Security:
.env file (gitignored)Bundled references (load as needed):
references/caldav-library.md - Python caldav library guidereferences/quick-reference.md - Command examplesreferences/troubleshooting.md - Error solutionsExternal documentation:
CRITICAL: When invoking scripts from this skill via the zsh-tool, ALWAYS use pty: true.
Without PTY mode, command output will not be visible even though commands execute successfully.
Correct invocation pattern:
<invoke name="mcp__plugin_zsh-tool_zsh-tool__zsh">
<parameter name="command">python ./skills/radicale/scripts/radicale-api.py [args]</parameter>
<parameter name="pty">true</parameter>
</invoke>