This skill should be used when managing calendars and contacts on a self-hosted Radicale CalDAV/CardDAV server. Use when the user asks to "list my calendar", "what's on my calendar this week", "show me my events", "when is my next event", "add to my calendar", "create an event", "schedule a meeting", "schedule an event", "delete an event", "cancel event", "remove event", "find a contact", "what's someone's email", "search my contacts", "who is", "add a contact", "save contact", "save someone's phone number", or mentions Radicale, CalDAV, CardDAV, calendar events, or contact management operations.
From homelab-corenpx claudepluginhub jmagar/claude-homelab --plugin homelab-coreThis skill uses the workspace's default tool permissions.
README.mdload-env.shreferences/caldav-library.mdreferences/quick-reference.mdreferences/troubleshooting.mdscripts/radicale-api.pyGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Configures VPN and dedicated connections like Direct Connect, ExpressRoute, Interconnect for secure on-premises to AWS, Azure, GCP, OCI hybrid networking.
⚠️ 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>