Preface

DeepSeek Harness (command name dsh) is an intelligent agent runtime open-sourced by DeepSeek AI. Its core philosophy is written in the official repository: Everything is a Plugin. Models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and interfaces can all be added or removed via profiles without modifying the harness source code. The official onboarding path is to install Node.js and run npx @deepseek-ai/dsh web. It is currently a developer preview version, and the APIs are subject to change.

Agents excel at modifying code and running commands, but their schedules are usually not stored in repositories, but on Google Calendar, iCloud, or self-hosted Nextcloud. If you ask it to “schedule a review at 2 PM tomorrow”, it cannot see existing time conflicts or write the event back to the calendar. The community plugin dsh-calendar fills this gap: it provides five core operations for models via CalDAV: listing, creating, updating, deleting, and searching events.

First, please clarify the source. The plugin directory deepseek-harness-plugin.com referenced in this article is an independent community site for discovering and comparing plugins, and has no official affiliation with DeepSeek / Hujiang. Do not treat it as an official app store. The following content is organized after cross-checking the directory’s detail page, the plugin’s GitHub repository (including README, package.json, cordis.patch.yml, and source code entry), and official DeepSeek Harness documentation.

What is this

dsh-calendar is a Tool & Capability plugin maintained by STARDUSTLC666, with its source code hosted at STARDUSTLC666/dsh-calendar. The npm package name is also dsh-calendar, and the current version is 0.3.2 (consistent between package.json and the npm registry). The package.json and npm metadata declare the license as MIT; there is no separate LICENSE file in the repository root, and the license field in the GitHub repository metadata is empty. It is recommended to verify the license yourself before installation.

As of August 18, 2026, both the directory page and GitHub repository have 3 stars. The directory page shows the primary language as JavaScript, with a collection date of 2026-08-15 and a recent push on 2026-08-16. The repository source code in src/ is written in TypeScript, with build artifacts in lib/. The runtime requires Node.js 18 or higher. Its dependencies are tsdav, ical.js, and undici, with no native extensions. The README describes it as “pure Node.js cross-platform”.

In one sentence: It turns CalDAV calendars into five model-facing tools (calendar_list / calendar_create / calendar_update / calendar_delete / calendar_search), compatible with Google, iCloud, Nextcloud, and any custom CalDAV endpoint. This iteration is a node-only version with no web setup page; all configuration must be written in the profile’s cordis.patch.yml.

The plugin will load normally when the configuration is missing, and will not crash dsh. Only when the tool is actually called will it throw an error with Chinese instructions, prompting you to complete the configuration and restart. This behavior is specified in the README and the comments in cordis.patch.yml.

Core Features

According to the repository README and the source code entry src/index.ts, the plugin registers five tools into the host’s ctx.tools in the apply(ctx, config) function. The stable event identifier uid is the full href of the CalDAV object, which is used for updates and deletions.

  1. calendar_list: Lists events within a specified time range. start / end use ISO 8601 format, with the default being the next 7 days. By default, RRULE recurring events are expanded (expand defaults to true, maxOccurrences defaults to 30, with a range of 1–200): each instance is displayed on a separate line, with isOccurrence: true and seriesStart; non-recurring events remain with isOccurrence: false. When expand is set to false, recurring events are returned as original single entries with an rrule field. Results are stably sorted by start time.
  2. calendar_create: Creates a new event. summary / start / end are required, while description / location / allDay / rrule are optional. It validates real calendar dates and requires end >= start, rejecting invalid dates such as 2025-02-30.
  3. calendar_update: Modifies an event by uid. Fields that are not provided will retain their original values. Version 0.3.2 fixed the issue where rrule was lost when modifying other fields.
  4. calendar_delete: Deletes an event by uid.
  5. calendar_search: Performs client-side filtering by keywords across titles, descriptions, locations, and UIDs, case-insensitively. limit defaults to 50, with a range of 1–200. Results are sorted by start time. The search returns the original series, and will not expand recurring instances.

The time convention is also written in the README: both input and output use ISO 8601 uniformly. Timed events are output in UTC (e.g. 2025-01-15T01:00:00Z), while all-day events use YYYY-MM-DD. Inputs can include timezone offsets (e.g. 2025-01-15T09:00:00+08:00), and the plugin internally converts them to UTC for storage. Events with TZID will be converted to UTC in the output; complex rules such as all-day boundaries and daylight saving time are not handled in detail.

Two additional implementation details are worth noting separately:
- Plugin-level proxy: The configuration item proxyUrl (e.g. http://127.0.0.1:7890) only routes CalDAV requests from this plugin to the local proxy port, without modifying the system proxy or affecting other plugins. The README states that this item usually needs to be filled in mainland China when accessing Google / iCloud CalDAV endpoints; services that can be accessed directly domestically (such as self-hosted Nextcloud) do not need to fill it in.
- Retryable client failure: Starting from version 0.3.2, if the CalDAV client fails to create a connection, it will clear the cache, allowing the next call to re-establish the connection, and no longer permanently reusing rejected Promises.

Installation and Activation

The installation command given on the directory page is as follows, quoted verbatim from the page:

dsh plugin add github:stardustlc666/dsh-calendar

For reproducible installations, fix the commit hash according to the directory page instructions. At the time of writing, the latest commit on the repository’s main branch is 596f0420ac0f72db190d078cec91a4c18916b60b (2026-08-16):

dsh plugin add github:stardustlc666/dsh-calendar#596f0420ac0f72db190d078cec91a4c18916b60b

The repository README also describes an installation method using the npm package name and specifying a web profile:

dsh plugin --profile web add dsh-calendar

Both methods point to the same community plugin. The directory page emphasizes that the plugin runs with the permissions of the current dsh process, and may execute code during installation; please check the source code repository and license before installing.

You need to restart dsh after installation. The plugin will insert a configuration row with id calendar into the profile (see the included cordis.patch.yml in the package). The default provider is custom, and no credentials are filled in.

Configuration and Typical Usage

All configuration is located in the current profile’s cordis.patch.yml, overwriting the entire config of the calendar row by id. The general fields are as follows:
- provider: google | icloud | nextcloud | custom
- caldavUrl: Full calendar collection URL (required for custom / icloud; can also be manually filled to override presets for google / nextcloud)
- username: CalDAV account (use the account email for Google / iCloud)
- password: Password; for Google / iCloud, please use app-specific passwords. It is recommended to use the environment variable DSH_CALENDAR_PASSWORD instead to avoid writing plaintext into the configuration file
- proxyUrl: Local proxy address
- calendarId: For Google only, calendar ID (usually the email address)
- host / user / calendar: For Nextcloud only

Google example (the plugin constructs the URL as https://apidata.googleusercontent.com/caldav/v2/<calendarId>/events):

- id: calendar
  name: dsh-calendar
  config:
    provider: google
    username: you@gmail.com
    calendarId: you@gmail.com
    # password is recommended to use the environment variable DSH_CALENDAR_PASSWORD
    # Fill in only if the CalDAV endpoint cannot be accessed directly:
    # proxyUrl: http://127.0.0.1:7890

iCloud requires the full calendar collection URL (including user ID and calendar ID). The repository notes that this can be found in iCloud’s calendar CalDAV settings, and the plugin does not perform automatic principal discovery:

- id: calendar
  name: dsh-calendar
  config:
    provider: icloud
    username: you@icloud.com
    caldavUrl: https://caldav.icloud.com/123456789/calendars/<calendarID>/

Nextcloud example (the plugin constructs the URL as https://cloud.example.com/remote.php/dav/calendars/alice/personal/):

- id: calendar
  name: dsh-calendar
  config:
    provider: nextcloud
    username: alice
    host: https://cloud.example.com
    user: alice
    calendar: personal

Custom CalDAV:

- id: calendar
  name: dsh-calendar
  config:
    provider: custom
    caldavUrl: https://dav.example.com/calendars/me/work/
    username: me

Do not confuse app-specific passwords with login passwords. The paths to generate them are:
- Google: myaccount.google.com → Security → 2-Step Verification (must be enabled first) → App passwords, generate a 16-digit password.
- iCloud: appleid.apple.com → Sign-In and Security → App-Specific Passwords.

When the call returns 401/403, the repository notes that it is most likely using the login password instead of the app-specific password, and the plugin will provide a Chinese prompt. The authentication method is only Basic, with no OAuth flow for Google / iCloud.

After configuration, you can directly ask the model to call these tools in the session, for example: list events for the next week, create a weekly meeting with an rrule, search for “review” by keyword, or modify the time / delete an event by uid. Refer to the current repository README for tool parameters; this article does not include additional conversation logs.

Applicable Scenarios and Notes

It is suitable for individuals or small teams already using CalDAV: they want the intelligent agents in DeepSeek Harness to view available time slots, create meetings, modify times, or search by title, without needing to switch to the calendar webpage. Self-hosted Nextcloud or other directly accessible CalDAV services have relatively simple configurations; when connecting to Google / iCloud, you need to prepare app-specific passwords and decide whether to fill in proxyUrl based on the network environment.

Please review the following limitations before use, all of which come from the repository’s “Known Limitations” and are not inferred:
1. Recurring events: calendar_list uses ICAL.RecurExpansion to expand events by default, capped by maxOccurrences; calendar_search does not expand events. calendar_update / calendar_delete target the entire recurring series, and cannot modify or delete only a single occurrence (does not support RECURRENCE-ID).
2. No OAuth, no calendar discovery: iCloud requires manual entry of the full collection URL; there is no multi-calendar selector.
3. No setup page UI: This iteration only supports configuration via cordis.patch.yml.
4. Timeout: The overall tool timeout timeoutMs is 60 seconds, and AbortSignal is not passed through to each network request.
5. Credentials and permissions: Passwords will appear in configuration or environment variables, and the plugin can list, create, modify, and delete calendar events. It runs with the permissions of the current dsh process, so you should check the source code and license before installing.

Summary

dsh-calendar does one specific thing: connects CalDAV calendars to the tool layer of DeepSeek Harness, allowing intelligent agents to perform a full set of operations from listing to searching on existing Google / iCloud / Nextcloud / custom calendars. It does not provide a setup page, nor does it support OAuth; in exchange, it offers pure Node.js support, does not crash on missing configuration, and includes a plugin-only proxyUrl.

Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-calendar/

GitHub: https://github.com/STARDUSTLC666/dsh-calendar