cal-scheduler
PYPI · CAL-SCHEDULER-MCP · SCANNED SEP 20
Timezone-correct CalDAV scheduling MCP server with validated recurrence and single-occurrence edits.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security93
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs a script at install time (build_backend) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does. View diagnostics → Partial
- 3 of 51 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: the license (MIT License) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 34 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability69
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 1209 tokens (~109/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 12% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_calendar" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the cal-scheduler MCP server?
cal-scheduler runs locally as a PyPI package, launched with uvx cal-scheduler-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · cal-scheduler-mcp
claude mcp add limey-cal-scheduler-mcp -- uvx cal-scheduler-mcp
{
"mcpServers": {
"limey-cal-scheduler-mcp": {
"command": "uvx",
"args": [
"cal-scheduler-mcp"
]
}
}
} {
"servers": {
"limey-cal-scheduler-mcp": {
"command": "uvx",
"args": [
"cal-scheduler-mcp"
]
}
}
} codex mcp add limey-cal-scheduler-mcp -- uvx cal-scheduler-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"limey-cal-scheduler-mcp": {
"type": "local",
"command": [
"uvx",
"cal-scheduler-mcp"
],
"enabled": true
}
}
} openclaw mcp add limey-cal-scheduler-mcp --command uvx --arg cal-scheduler-mcp
mcp_servers:
limey-cal-scheduler-mcp:
command: "uvx"
args: ["cal-scheduler-mcp"] {
"McpServers": {
"limey-cal-scheduler-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"cal-scheduler-mcp"
]
}
}
} assistant mcp add limey-cal-scheduler-mcp -t stdio -c uvx -a cal-scheduler-mcp
{
"mcpServers": {
"limey-cal-scheduler-mcp": {
"command": "uvx",
"args": [
"cal-scheduler-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 0
- Package version: 1.1.1 → 1.1.3 functional
- 16 Sept 26 −3
- Stability: pass → 0.77 functional
- 15 Sept 26 +1
- Stability: 0.97 → pass security
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 −2
- Stability: pass → 0.83 functional
- 9 Sept 26 +1
- Stability: 0.97 → pass security
- Package version: 1.1.1 → 1.1.3 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/cal-scheduler-mcp@1.1.3
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | unreviewed | uv_build |
Background: Why install scripts are a supply-chain risk →
Dependencies 51 packages
| Packages resolved | 51 |
|---|---|
| Stale | 2 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
create_calendar ~52
Create a new calendar with the given display name. Returns `{"ok": True, "created": name}`. The name must be unique; a duplicate name raises an error.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
No output schema declared.
No examples provided.
create_event ~255
Create an event (single, or recurring if `rrule` is given). `start`/`end` are ISO 8601 (see parameter docs for zone + default-duration details — read those before writing). `rrule` is a raw RRULE body, e.g. "FREQ=WEEKLY;COUNT=12". `calendar` is required in practice — there is no default calendar. Pick deliberately; events are not validated against calendar type.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| description | – | – | – |
| end | – | – | ISO 8601 datetime. Omit for the default duration: 1 hour after `start` for timed events, 1 day after `start` for all-day. Must be after `start`. |
| location | – | – | – |
| rrule | – | – | – |
| start | string | yes | ISO 8601 datetime. A bare local time is interpreted as wall time in the configured zone (`Pacific/Auckland`); an offset-qualified time is honoured and stored in that zone. Use `resolve_datetime` to c… |
| summary | string | yes | – |
No output schema declared.
No examples provided.
delete_calendar ~41
Delete a calendar and all of its events. Irreversible. Returns `{"ok": True, "deleted": name}`.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
No output schema declared.
No examples provided.
delete_event ~37
Delete a whole event/series (and any of its overrides). Irreversible.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| uid | string | yes | – |
No output schema declared.
No examples provided.
exclude_occurrence ~137
Drop a single occurrence of a recurring series (EXDATE). `occurrence` is the instance's current start exactly as returned by `list_events`, including the UTC offset (e.g. `2026-06-18T09:00:00+12:00`). Bare local times may not match. The response includes `series_remaining` (occurrences left in the series) and `overrides` (RECURRENCE-ID overrides on the series) so the rest-of-series-unchanged claim is observable.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| occurrence | string | yes | – |
| uid | string | yes | – |
No output schema declared.
No examples provided.
list_calendars ~39
List the calendars available on the account. Returns `{"calendars": [name, ...]}` with account calendar names sorted alphabetically.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_events ~68
List event occurrences in [start, end], expanding recurring series. Dates are interpreted in the calendar's configured zone. Returns one entry per occurrence (recurring instances are expanded), sorted by start.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| end | string | yes | – |
| start | string | yes | – |
No output schema declared.
No examples provided.
mark_done ~109
Mark an event (or one occurrence of a series) done at the current UTC moment. `occurrence=None` marks the whole event / series; otherwise marks only that occurrence (via a RECURRENCE-ID override). Idempotent: re-marking replaces the prior timestamp. The response includes `series_remaining` and `overrides` for parity with move_occurrence / exclude_occurrence.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| occurrence | – | – | – |
| uid | string | yes | – |
No output schema declared.
No examples provided.
move_occurrence ~239
Reschedule a single occurrence of a series (RECURRENCE-ID override). `occurrence` is the instance's current start exactly as returned by `list_events`, including the UTC offset (e.g. `2026-06-18T09:00:00+12:00`). Bare local times may not match. `new_start`/`new_end` are where it moves to. Omit `new_end` to keep the occurrence's existing duration. The rest of the series is unchanged. The response includes `series_remaining` (occurrences left in the series) and `overrides` (RECURRENCE-ID overrides on the series) so the rest-of-series-unchanged claim is observable.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| new_end | – | – | – |
| new_start | string | yes | ISO 8601 datetime. A bare local time is interpreted as wall time in the configured zone (`Pacific/Auckland`); an offset-qualified time is honoured and stored in that zone. Use `resolve_datetime` to c… |
| occurrence | string | yes | – |
| uid | string | yes | – |
No output schema declared.
No examples provided.
resolve_datetime ~39
Show how a datetime string will be interpreted, without writing anything. Use this to confirm a zone before committing an event.
| Name | Type | Req | Description |
|---|---|---|---|
| value | string | yes | – |
No output schema declared.
No examples provided.
update_event ~193
Edit a whole event/series. Only the fields you pass change. Preserves the UID and any single-occurrence exclusions/overrides. If you move `start` without giving `end`, the duration is kept. Moving `start` re-anchors the whole series — occurrences before the new start stop being generated (this retimes an entire series; it does not split one at a date).
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | – | – | – |
| description | – | – | – |
| end | – | – | – |
| location | – | – | – |
| rrule | – | – | – |
| start | – | – | ISO 8601 datetime. A bare local time is interpreted as wall time in the configured zone (`Pacific/Auckland`); an offset-qualified time is honoured and stored in that zone. Use `resolve_datetime` to c… |
| summary | – | – | – |
| uid | string | yes | – |
No output schema declared.
No examples provided.
What is the cal-scheduler MCP server?
cal-scheduler is an MCP server listed in the public MCP registry as io.github.limey/cal-scheduler-mcp. Timezone-correct CalDAV scheduling MCP server with validated recurrence and single-occurrence edits. This page covers its PyPI package (cal-scheduler-mcp).
Is the cal-scheduler MCP server safe to use?
cal-scheduler scores 74 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the cal-scheduler MCP server expose?
cal-scheduler exposes 11 tools: list_calendars, create_calendar, delete_calendar, list_events, resolve_datetime, and 6 more. Their descriptions and schemas cost roughly 1,209 tokens of context every time the server is loaded.
Is the cal-scheduler MCP server still maintained?
cal-scheduler is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.