← Back to Skills
DevOps

openclaw-nextcloud

keithvassallomt By keithvassallomt 👁 12 views ▲ 0 votes

Manage Notes, Tasks, Calendar, Files

GitHub
---
name: openclaw-nextcloud
description: Manage Notes, Tasks, Calendar, Files, and Contacts in your Nextcloud instance via CalDAV, WebDAV, and Notes API. Use for creating notes, managing todos and calendar events, uploading/downloading files, and managing contacts.
license: MIT
compatibility: Requires Node.js 20+. Needs network access to Nextcloud instance.
allowed-tools: Bash Read
---

# OpenClaw Nextcloud Skill

This skill provides integration with a Nextcloud instance. It supports access to Notes, Tasks (Todos), Calendars, Files, and Contacts.

## Configuration

The skill requires the following environment variables:

- `NEXTCLOUD_URL`: The base URL of your Nextcloud instance (e.g., `https://cloud.example.com`).
- `NEXTCLOUD_USER`: Your Nextcloud username.
- `NEXTCLOUD_TOKEN`: An App Password (recommended) or your login password.

## Features

### 1. Notes (Read/Write)
- List, get, create, update, and delete notes.
- API: `index.php/apps/notes/api/v1/notes`

### 2. Tasks / Todos (Read/Write)
- List, create, update, delete, and complete tasks.
- API: CalDAV (VTODO).

### 3. Calendar (Read/Write)
- List, create, update, and delete events.
- API: CalDAV (VEVENT).

### 4. Files (Read/Write)
- List, search, upload, download, and delete files.
- API: WebDAV.

### 5. Contacts (Read/Write)
- List, get, create, update, delete, and search contacts.
- API: CardDAV.

## Usage

Run the skill via the bundled script.

```bash
node scripts/nextcloud.js <command> <subcommand> [options]
```

## Commands

### Notes
- `notes list`
- `notes get --id <id>`
- `notes create --title <t> --content <c> [--category <cat>]`
- `notes edit --id <id> [--title <t>] [--content <c>] [--category <cat>]`
- `notes delete --id <id>`

### Tasks
- `tasks list [--calendar <c>]`
- `tasks create --title <t> [--calendar <c>] [--due <d>] [--priority <p>] [--description <d>]`
- `tasks edit --uid <u> [--calendar <c>] [--title <t>] [--due <d>] [--priority <p>] [--description <d>]`
- `tasks delete --uid <u> [--calendar <c>]`
- `tasks complete --uid <u> [--calendar <c>]`

### Calendar Events
- `calendar list [--from <iso>] [--to <iso>]` (Defaults to next 7 days)
- `calendar create --summary <s> --start <iso> --end <iso> [--calendar <c>] [--description <d>]`
- `calendar edit --uid <u> [--calendar <c>] [--summary <s>] [--start <iso>] [--end <iso>] [--description <d>]`
- `calendar delete --uid <u> [--calendar <c>]`

### Calendars (list available calendars)
- `calendars list [--type <tasks|events>]`

### Files
- `files list [--path <path>]`
- `files search --query <q>`
- `files get --path <path>` (download file content)
- `files upload --path <path> --content <content>`
- `files delete --path <path>`

### Contacts
- `contacts list [--addressbook <ab>]`
- `contacts get --uid <u> [--addressbook <ab>]`
- `contacts search --query <q> [--addressbook <ab>]`
- `contacts create --name <n> [--addressbook <ab>] [--email <e>] [--phone <p>] [--organization <o>] [--title <t>] [--note <n>]`
- `contacts edit --uid <u> [--addressbook <ab>] [--name <n>] [--email <e>] [--phone <p>] [--organization <o>] [--title <t>] [--note <n>]`
- `contacts delete --uid <u> [--addressbook <ab>]`

### Address Books (list available address books)
- `addressbooks list`

## Output Format

All outputs are JSON formatted.

### Tasks List Output
```json
{
  "status": "success",
  "data": [
    {
      "uid": "unique-task-id",
      "calendar": "Calendar Name",
      "summary": "Task title",
      "status": "NEEDS-ACTION",
      "due": "20260201T153000Z",
      "priority": 0
    }
  ]
}
```
- `due`: CalDAV format date (YYYYMMDDTHHmmssZ) or null
- `priority`: 0-9 (0 = undefined, 1 = highest, 9 = lowest) or null

### Calendar Events List Output
```json
{
  "status": "success",
  "data": [
    {
      "uid": "unique-event-id",
      "calendar": "Calendar Name",
      "summary": "Event title",
      "start": "20260205T100000Z",
      "end": "20260205T110000Z"
    }
  ]
}
```

### Contacts List Output
```json
{
  "status": "success",
  "data": [
    {
      "uid": "unique-contact-id",
      "addressBook": "Address Book Name",
      "fullName": "John Doe",
      "name": "Doe;John;;;",
      "phones": ["+1234567890"],
      "emails": ["[email protected]"],
      "organization": "ACME Inc",
      "title": "Developer",
      "note": "Met at conference"
    }
  ]
}
```
- `phones`: Array of phone numbers or null
- `emails`: Array of email addresses or null
- `name`: Structured name in vCard format (Last;First;Middle;Prefix;Suffix)

### General Format
```json
{
  "status": "success",
  "data": [ ... ]
}
```

or

```json
{
  "status": "error",
  "message": "Error description"
}
```

## Agent Behavior: Default Calendar Selection

When creating tasks or calendar events, if the user does not specify a calendar:

1. **First time (no default set):**
   - Run `calendars list --type tasks` (for tasks) or `calendars list --type events` (for events)
   - Ask the user which calendar to use from the list
   - Ask if they want to set it as the default for future operations
   - Remember their choice in memory

2. **If user sets a default:**
   - Remember `default_task_calendar` and/or `default_event_calendar`
   - Use automatically for subsequent operations without asking

3. **If user declines to set a default:**
   - Ask again next time they create a task/event without specifying a calendar

4. **User can always override:**
   - Explicitly specifying `--calendar` always takes precedence over the default

### Memory Keys
- `default_task_calendar`: Default calendar name for tasks (VTODO)
- `default_event_calendar`: Default calendar name for events (VEVENT)

## Agent Behavior: Default Address Book Selection

When creating contacts, if the user does not specify an address book:

1. **First time (no default set):**
   - Run `addressbooks list`
   - Ask the user which address book to use from the list
   - Ask if they want to set it as the default for future operations
   - Remember their choice in memory

2. **If user sets a default:**
   - Remember `default_addressbook`
   - Use automatically for subsequent operations without asking

3. **If user declines to set a default:**
   - Ask again next time they create a contact without specifying an address book

4. **User can always override:**
   - Explicitly specifying `--addressbook` always takes precedence over the default

### Memory Keys
- `default_addressbook`: Default address book name for contacts

## Agent Behavior: Presenting Information

When displaying data to the user, format it in a readable way. Output may be sent to messaging platforms (Telegram, WhatsApp, etc.) where markdown does not render, so avoid markdown formatting.

### General Guidelines
- Use emojis to make output scannable and friendly
- Do NOT use markdown formatting (no **bold**, *italic*, `code`, tables, or lists with - or *)
- Use plain text with line breaks for structure
- Convert technical formats (like CalDAV dates) to human-readable formats
- Group related items logically

### Emoji Reference
Tasks: βœ… (completed), ⬜ (pending), πŸ”΄ (high priority), 🟑 (medium), 🟒 (low)
Calendar: πŸ“… (event), ⏰ (time), πŸ“ (location)
Notes: πŸ“ (note), πŸ“ (category)
Files: πŸ“„ (file), πŸ“‚ (folder), πŸ’Ύ (size)
Contacts: πŸ‘€ (person), πŸ“§ (email), πŸ“± (phone), 🏒 (organization)
Status: ✨ (created), ✏️ (updated), πŸ—‘οΈ (deleted), ❌ (error)

### Example Presentations

Tasks:
```
πŸ“‹ Your Tasks

⬜ πŸ”΄ Buy groceries β€” Due: Tomorrow 3:30 PM
⬜ 🟑 Review PR #42 β€” Due: Feb 5
βœ… Send email to client
```

Calendar Events:
```
πŸ“… Upcoming Events

πŸ—“οΈ Team Standup
   ⏰ Mon, Feb 3 β€’ 10:00 AM - 10:30 AM
   πŸ“ Zoom

πŸ—“οΈ Project Review
   ⏰ Wed, Feb 5 β€’ 2:00 PM - 3:00 PM
```

Contacts:
```
πŸ‘€ John Doe
   πŸ“§ [email protected]
   πŸ“± +1 234 567 890
   🏒 ACME Inc β€” Developer
```

Files:
```
πŸ“‚ Documents/
   πŸ“„ report.pdf (2.3 MB)
   πŸ“„ notes.txt (4 KB)
   πŸ“‚ Archive/
```

### Date/Time Formatting
Convert CalDAV format 20260205T100000Z to readable format like Wed, Feb 5 β€’ 10:00 AM
Show relative dates when helpful: "Tomorrow", "Next Monday", "In 3 days"
Use the user's local timezone when possible
devops

Comments

Sign in to leave a comment

Loading comments...