{"_id":"@datenknoten/caldav-mcp","_rev":"3-b7540f728723ccefb07038b25f52af01","name":"@datenknoten/caldav-mcp","dist-tags":{"latest":"1.0.1"},"versions":{"0.1.0":{"name":"@datenknoten/caldav-mcp","version":"0.1.0","keywords":["caldav","calendar","ical","icloud","keyring","mcp","model-context-protocol","obsidian","obsidian-tasks"],"author":{"name":"datenknoten"},"license":"MIT","_id":"@datenknoten/caldav-mcp@0.1.0","maintainers":[{"name":"0xaffe","email":"tim@datenknoten.me"}],"homepage":"https://gitlab.com/datenknoten/caldav-mcp-server#readme","bugs":{"url":"https://gitlab.com/datenknoten/caldav-mcp-server/-/issues"},"bin":{"caldav-mcp":"dist/cli.js"},"dist":{"shasum":"b539ae4edf56854a3d07722cbdbd0005f3a009d7","tarball":"https://registry.npmjs.org/@datenknoten/caldav-mcp/-/caldav-mcp-0.1.0.tgz","fileCount":38,"integrity":"sha512-qTnra1mEPjzQDcV/5RDCiLwZVMYsQMz8CkD4h8JXrzXgOEAjj7RDX3mzs602qjtv74IiolWlmhbeS8uxRqE/vw==","signatures":[{"sig":"MEUCIDXYI227gWfHdWVrp4dkniG+AjDNZSxA7LPplu1RRxkuAiEA2obdZ9ieem4ff9Xr3lWyzOd75x4VWFo8Z4kLg7HYu+U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200998},"type":"module","engines":{"node":">=20"},"gitHead":"c9a5f8ba6136f698c8ea373bba109b12742d7a15","scripts":{"fmt":"oxfmt","lint":"oxlint","test":"vitest run","build":"tsc","smoke":"node scripts/smoke.mjs","release":"semantic-release","fmt:check":"oxfmt --check"},"_npmUser":{"name":"0xaffe","email":"tim@datenknoten.me"},"repository":{"url":"git+https://gitlab.com/datenknoten/caldav-mcp-server.git","type":"git"},"_npmVersion":"11.19.0","description":"CalDAV MCP server: expanded calendar entries in, CalDAV writes out; the agent owns the Obsidian vault","directories":{},"_nodeVersion":"26.7.0","dependencies":{"pino":"10.3.1","luxon":"3.7.2","tsdav":"2.3.1","yargs":"17.7.2","arktype":"2.2.3","ical.js":"2.2.1","@napi-rs/keyring":"1.3.0","@inquirer/prompts":"8.6.0","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"aube@1.41.0","devDependencies":{"oxfmt":"0.64.0","oxlint":"1.79.0","vitest":"4.1.11","typescript":"6.0.3","@types/node":"26.2.0","@types/luxon":"3.7.5","@types/yargs":"17.0.35","@commitlint/cli":"21.2.2","semantic-release":"25.0.9","@semantic-release/git":"11.0.1","@semantic-release/gitlab":"13.3.3","@semantic-release/changelog":"7.0.0","@commitlint/config-conventional":"21.2.2","conventional-changelog-conventionalcommits":"9.3.1"},"_npmOperationalInternal":{"tmp":"tmp/caldav-mcp_0.1.0_1787467265128_0.030505327308568697","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@datenknoten/caldav-mcp","version":"1.0.0","keywords":["caldav","calendar","ical","icloud","keyring","mcp","model-context-protocol","obsidian","obsidian-tasks"],"author":{"name":"datenknoten"},"license":"MIT","_id":"@datenknoten/caldav-mcp@1.0.0","maintainers":[{"name":"0xaffe","email":"tim@datenknoten.me"}],"homepage":"https://gitlab.com/datenknoten/caldav-mcp-server#readme","bugs":{"url":"https://gitlab.com/datenknoten/caldav-mcp-server/-/issues"},"bin":{"caldav-mcp":"dist/cli.js"},"dist":{"shasum":"8f0cfd2d5f4dabec1ee70d9bb7ec6f29515750ae","tarball":"https://registry.npmjs.org/@datenknoten/caldav-mcp/-/caldav-mcp-1.0.0.tgz","fileCount":38,"integrity":"sha512-DLdFUDAX/QdauEnof1yrtUv9HtZV7uwEJ34OsJLKcJy174K0Tx2OSo+kLHke3UUPHuWHG+NptJNH8hxEUM+UKA==","signatures":[{"sig":"MEUCIQCLzvJHAFqBHKr4IzQUDvgfT9YwH9h3hT4PQA59wnWD2QIgDszZAb9Q2sRSo8Ugns7z+v37OAfJbWAWtDy6xgkDMSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200998},"type":"module","engines":{"node":">=20"},"gitHead":"aabb00644e79ed3aa11fbaf53d28108de6c5814a","scripts":{"fmt":"oxfmt","lint":"oxlint","test":"vitest run","build":"tsc","smoke":"node scripts/smoke.mjs","release":"semantic-release","fmt:check":"oxfmt --check"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:9e806616-896a-4609-9ed5-fa64ee478b6e"}},"repository":{"url":"git+https://gitlab.com/datenknoten/caldav-mcp-server.git","type":"git"},"_npmVersion":"11.19.0","description":"CalDAV MCP server: expanded calendar entries in, CalDAV writes out; the agent owns the Obsidian vault","directories":{},"_nodeVersion":"26.7.0","dependencies":{"pino":"10.3.1","luxon":"3.7.2","tsdav":"2.3.1","yargs":"17.7.2","arktype":"2.2.3","ical.js":"2.2.1","@napi-rs/keyring":"1.3.0","@inquirer/prompts":"8.6.0","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"aube@1.41.0","devDependencies":{"oxfmt":"0.64.0","oxlint":"1.79.0","vitest":"4.1.11","typescript":"6.0.3","@types/node":"26.2.0","@types/luxon":"3.7.5","@types/yargs":"17.0.35","@commitlint/cli":"21.2.2","semantic-release":"25.0.9","@semantic-release/git":"11.0.1","@semantic-release/gitlab":"13.3.3","@semantic-release/changelog":"7.0.0","@commitlint/config-conventional":"21.2.2","conventional-changelog-conventionalcommits":"9.3.1"},"_npmOperationalInternal":{"tmp":"tmp/caldav-mcp_1.0.0_1787467522633_0.588131109834253","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@datenknoten/caldav-mcp","version":"1.0.1","description":"CalDAV MCP server: expanded calendar entries in, CalDAV writes out; the agent owns the Obsidian vault","keywords":["caldav","calendar","ical","icloud","keyring","mcp","model-context-protocol","obsidian","obsidian-tasks"],"homepage":"https://gitlab.com/datenknoten/caldav-mcp-server#readme","bugs":{"url":"https://gitlab.com/datenknoten/caldav-mcp-server/-/issues"},"license":"MIT","author":{"name":"datenknoten"},"repository":{"type":"git","url":"git+https://gitlab.com/datenknoten/caldav-mcp-server.git"},"bin":{"caldav-mcp":"dist/cli.js"},"type":"module","publishConfig":{"access":"public"},"scripts":{"build":"tsc","test":"vitest run","smoke":"node scripts/smoke.mjs","lint":"oxlint","fmt":"oxfmt","fmt:check":"oxfmt --check","release":"semantic-release"},"dependencies":{"@inquirer/prompts":"8.6.0","@modelcontextprotocol/server":"2.0.0","@napi-rs/keyring":"1.3.0","arktype":"2.2.3","ical.js":"2.2.1","luxon":"3.7.2","pino":"10.3.1","tsdav":"2.3.1","yargs":"17.7.2"},"devDependencies":{"@commitlint/cli":"21.2.2","@commitlint/config-conventional":"21.2.2","@semantic-release/changelog":"7.0.0","@semantic-release/git":"11.0.1","@semantic-release/gitlab":"13.3.3","@types/luxon":"3.7.5","@types/node":"26.2.0","@types/yargs":"17.0.35","conventional-changelog-conventionalcommits":"9.3.1","oxfmt":"0.64.0","oxlint":"1.79.0","semantic-release":"25.0.9","typescript":"6.0.3","vitest":"4.1.11"},"engines":{"node":">=20"},"packageManager":"aube@1.41.0","gitHead":"648b3deaa7d345cfdb3e449b11cc4f54c85ae68a","_id":"@datenknoten/caldav-mcp@1.0.1","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-TLIWUr7CpCN7Gu5V7WZ9eaypudVXHGGczBSDlUXkHAbYEzIuqkU84cFHhgmceGEKhpHKPTT4EUZQRCzfZb9wqg==","shasum":"23d1790444a340cd40985bdd953e2745fe182e5e","tarball":"https://registry.npmjs.org/@datenknoten/caldav-mcp/-/caldav-mcp-1.0.1.tgz","fileCount":38,"unpackedSize":211811,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDtNci/0z+/u02O9tMrecXNRenmu8CFHhGvJ52HNLBNwwIgNwAQAd6c9DpSNyD39thPGuaFEK40aMVsYItxqyjYdPo="}]},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:9e806616-896a-4609-9ed5-fa64ee478b6e"}},"directories":{},"maintainers":[{"name":"0xaffe","email":"tim@datenknoten.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/caldav-mcp_1.0.1_1787499552691_0.530635415749763"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T06:41:04.954Z","modified":"2026-08-23T15:39:12.983Z","0.1.0":"2026-08-23T06:41:05.272Z","1.0.0":"2026-08-23T06:45:22.877Z","1.0.1":"2026-08-23T15:39:12.833Z"},"bugs":{"url":"https://gitlab.com/datenknoten/caldav-mcp-server/-/issues"},"author":{"name":"datenknoten"},"license":"MIT","homepage":"https://gitlab.com/datenknoten/caldav-mcp-server#readme","keywords":["caldav","calendar","ical","icloud","keyring","mcp","model-context-protocol","obsidian","obsidian-tasks"],"repository":{"type":"git","url":"git+https://gitlab.com/datenknoten/caldav-mcp-server.git"},"description":"CalDAV MCP server: expanded calendar entries in, CalDAV writes out; the agent owns the Obsidian vault","maintainers":[{"name":"0xaffe","email":"tim@datenknoten.me"}],"readme":"# @datenknoten/caldav-mcp\n\nA CalDAV MCP server for an Obsidian-Tasks workflow.\n\nThe server is **CalDAV-only**: it lists calendars, returns calendar entries already expanded\ninto single instances, and writes entries back to CalDAV. It never touches your vault — the\n*agent* writes the Markdown, guided by the workflow skill this package ships\n(`skills/caldav-obsidian`). That split is deliberate: the vault is the agent's territory, the\ncalendar is the server's.\n\n## Requirements\n\n- Node.js **≥ 20**.\n- An OS keyring for the CalDAV passwords — Secret Service (Linux), Keychain (macOS) or\n  Credential Manager (Windows) — or the passwords in the environment instead.\n- For iCloud an **app-specific** password. A 401 with credentials that look correct is almost\n  always the regular Apple ID password.\n\n## Install\n\n```bash\nnpm install -g @datenknoten/caldav-mcp\n```\n\nEquivalent with other toolchains: `aube add -g @datenknoten/caldav-mcp` or\n`mise use -g npm:@datenknoten/caldav-mcp`.\n\n## Quickstart\n\nRun setup in the directory that should carry the configuration — normally your vault:\n\n```bash\ncd /path/to/your/vault\ncaldav-mcp setup\n```\n\n`setup` is interactive and verifies before it stores. It\n\n- checks every account against its CalDAV server before writing anything,\n- offers the live calendar list as a checkbox instead of asking you to type display names,\n- stores each password in the OS keyring under `caldav-mcp/<account>`,\n- writes a secret-free, committable `.mcp.json` with `\"command\": \"caldav-mcp\"` and\n  `\"args\": [\"serve\"]`,\n- copies the workflow skill to `.claude/skills/caldav-obsidian`.\n\nA failed check offers retry, continue-unverified (type the calendar allowlist by hand) or\nabort.\n\nThe skill is not optional. Without it the agent invents its own task-line format and the\nround trip stops matching.\n\n## Manual registration\n\n```bash\nclaude mcp add --transport stdio caldav \\\n  --env CALDAV_ICLOUD_URL=https://caldav.icloud.com \\\n  --env CALDAV_ICLOUD_USERNAME=you@example.com \\\n  --env CALDAV_ICLOUD_PASSWORD=app-specific-password \\\n  --env EXPORT_CALENDAR=icloud/Privat \\\n  -- /absolute/path/to/node /absolute/path/to/caldav-mcp serve\n```\n\nUse **absolute paths**. The harness starts subprocesses with a different environment than your\nshell, and a `node` that mise or nvm cannot resolve is the most common cause of \"server\ndisconnected\".\n\n`caldav-mcp serve` and a bare `caldav-mcp` are the same thing — `serve` is the default command.\nIn a development checkout `dist/index.js` starts the same server and stays supported.\n\n## Configuration\n\nEverything comes from the environment. An account is defined by its `_URL` variable; its id is\n`<NAME>` lowercased.\n\n| Variable | Meaning |\n|---|---|\n| `CALDAV_<NAME>_URL` | CalDAV entry point, e.g. `https://caldav.icloud.com` or `https://host/dav.php`. Defines an account with id `<name>`. |\n| `CALDAV_<NAME>_USERNAME` | Account user. |\n| `CALDAV_<NAME>_PASSWORD` | Account password. Optional when the keyring holds one under `caldav-mcp/<name>`; the variable always wins when set. |\n| `CALDAV_<NAME>_CALENDARS` | Optional comma-separated display-name allowlist. Absent = every calendar of that account. |\n| `CALDAV_MCP_STATE` | Path of the bookkeeping ledger. Default `$XDG_STATE_HOME/caldav-mcp/state.json` (`~/.local/state/…`). |\n| `DEFAULT_TIMEZONE` | IANA zone for rendering and for interpreting exported times. Default: the system zone. |\n| `EXPORT_CALENDAR` | Default export target, `<account>/<calendar display name>`. |\n| `LOG_LEVEL` | pino level, default `info`. |\n\nAt least one account is required. A misconfigured environment aborts startup with a single\nfatal log line listing every problem at once, not one per run.\n\n## Tools\n\n| Tool | What it does |\n|---|---|\n| `list_calendars` | Lists the readable and writable calendars as `<account>/<name>` — the exact strings the other tools expect. |\n| `list_events` | Returns entries for a date window, recurrences already expanded, each with a stable id, its `[cal:: …]` marker and a ready-made Obsidian-Tasks line. |\n| `mark_imported` | Records that the task lines for those ids now exist in the vault, so the next read does not offer them again. |\n| `create_events` | Creates events from tasks and returns a marker per event to append to the source line. An event identical to an earlier export is refused as `duplicate` with that marker (`allowDuplicate: true` forces a second booking). `dryRun: true` shows the iCalendar payload instead of writing. |\n| `update_events` | Changes summary, date and times of events this server created, refusing to overwrite an event that changed on the server in the meantime. |\n\n## Security\n\n- Passwords never land in `.mcp.json`. That file stays committable; the secrets live in the OS\n  keyring or in the environment.\n- **stdout is the MCP transport.** All logging goes to stderr; a single stray `console.log`\n  would destroy the connection.\n- Event text is third-party data, not instructions. Summaries, descriptions and locations\n  arrive from whoever wrote the calendar entry and are treated as untrusted content.\n- Every pipeline scans the dependency graph with Socket.dev before anything installs it; a\n  policy finding blocks the pipeline. Contributions are scanned the same way — see\n  [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","readmeFilename":"README.md"}