Skip to content

Commit f38022e

Browse files
authored
Merge pull request #8 from PhilflowIO/fix/v2.3.0-proppatch-compatibility
fix(v2.3.0): Fix update_calendar PROPPATCH + remove non-working tools + add provider compatibility docs
2 parents 3b88c59 + 3beb70b commit f38022e

File tree

7 files changed

+447
-156
lines changed

7 files changed

+447
-156
lines changed

COMPATIBILITY.md

Lines changed: 324 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,324 @@
1+
# CalDAV/CardDAV Provider Compatibility
2+
3+
This document describes provider-specific behaviors, quirks, and workarounds discovered during testing with the tsdav MCP Server.
4+
5+
## Overview
6+
7+
While CalDAV (RFC 4791) and CardDAV (RFC 6352) are standardized protocols, real-world implementations differ due to:
8+
- Optional RFC features ("MAY support" vs "MUST support")
9+
- Backward compatibility requirements
10+
- Vendor-specific extensions
11+
- Performance optimizations
12+
13+
The tsdav library abstracts most differences, but some quirks affect user experience.
14+
15+
---
16+
17+
## Tested Providers
18+
19+
| Provider | CalDAV | CardDAV | Auth Method | Test Status | Overall Rating |
20+
|----------|--------|---------|-------------|-------------|----------------|
21+
| **Radicale** ||| Basic Auth | 100% PASS (22/22 tools) | ⭐⭐⭐⭐ Excellent |
22+
| **Baikal** ||| Basic Auth | 100% PASS (22/22 tools) | ⭐⭐⭐⭐⭐ Perfect |
23+
| **Nextcloud** ||| Basic Auth | 100% PASS (22/22 tools) | ⭐⭐⭐⭐ Excellent |
24+
| **iCloud** ||| Basic Auth (App Password) | Not Tested | ⭐⭐⭐⭐ Good (known to work) |
25+
| **Google Calendar** ||| OAuth2 | Not Supported Yet | ⭐⭐⭐ Good (needs OAuth2) |
26+
| **Microsoft 365** ||| OAuth2 | Not Supported Yet | ⭐⭐⭐ Good (needs OAuth2) |
27+
| **Fastmail** ||| Basic Auth / OAuth2 | Not Tested | ⭐⭐⭐⭐ Good |
28+
| **ZOHO** ||| Basic Auth | Not Tested | ⚠️ CardDAV not supported |
29+
30+
---
31+
32+
## Radicale (https://radicale.org/)
33+
34+
**Version Tested**: 3.x
35+
**Test Date**: 2025-10-09
36+
**Test Result**: 100% PASS (22/22 tools, 2042ms total)
37+
38+
### Strengths
39+
-**Fastest performance** - Average response time: ~2 seconds for full CRUD cycle
40+
-**Lightweight** - Minimal resource usage
41+
-**Simple setup** - Easy to deploy and configure
42+
-**Perfect compatibility** - All core CalDAV/CardDAV operations work flawlessly
43+
44+
### Known Quirks
45+
46+
#### 1. Calendar displayName Not Set on Creation
47+
**Severity**: Medium
48+
**Impact**: User Experience
49+
50+
**What Happens**:
51+
1. User creates calendar with `displayName: "My Personal Calendar"`
52+
2. MCP tool sends MKCOL request with displayName in properties
53+
3. Radicale creates calendar at URL: `https://radicale.../my-personal-calendar/`
54+
4. Radicale **ignores displayName** and sets it equal to URL slug: `"my-personal-calendar"`
55+
56+
**Why It Happens**:
57+
- RFC 4791 does not require servers to honor displayName during MKCOL
58+
- Radicale's lightweight design sets displayName = URL path by default
59+
- The displayName property is typically set via a separate PROPPATCH request
60+
61+
**Workaround**:
62+
```javascript
63+
// After creating calendar with make_calendar:
64+
const calendar = await client.makeCalendar({ url, props: { displayName: "My Personal Calendar" } });
65+
66+
// Immediately update the displayName via PROPPATCH:
67+
await updateCalendarTool({
68+
calendar_url: newCalendarUrl,
69+
display_name: "My Personal Calendar"
70+
});
71+
```
72+
73+
**Status**: ✅ `update_calendar` tool works perfectly and fixes the displayName via PROPPATCH.
74+
75+
**User Impact**: Minimal - Users can simply use `update_calendar` after `make_calendar` to set the desired name.
76+
77+
---
78+
79+
#### 2. Component-Set Restrictions Ignored
80+
**Severity**: Low
81+
**Impact**: None (actually beneficial)
82+
83+
**What Happens**:
84+
- You create a calendar with `components: ["VEVENT"]` (events only)
85+
- Radicale ignores this restriction
86+
- You can still create VTODO (tasks) in the same calendar
87+
- No error occurs
88+
89+
**Why It Happens**:
90+
- Radicale's design philosophy: simplicity over strict enforcement
91+
- RFC 4791 allows servers to ignore component-set restrictions
92+
93+
**Workaround**: None needed - this is actually a feature! It allows flexible use of calendars.
94+
95+
---
96+
97+
### Performance Benchmarks
98+
99+
| Operation | Avg Time | Notes |
100+
|-----------|----------|-------|
101+
| list_calendars | ~150ms | Very fast |
102+
| create_event | ~200ms | Instant feedback |
103+
| calendar_query | ~180ms | Efficient filtering |
104+
| update_calendar | ~120ms | PROPPATCH very fast |
105+
| delete_event | ~100ms | Quick cleanup |
106+
| **Full CRUD cycle** | **~2 seconds** | Fastest of all tested servers |
107+
108+
---
109+
110+
### Recommendations
111+
112+
**Best For**:
113+
- ✅ Personal calendars and contacts
114+
- ✅ Development and testing
115+
- ✅ Small teams (< 50 users)
116+
- ✅ Self-hosted lightweight deployments
117+
- ✅ Performance-critical applications
118+
119+
**Limitations**:
120+
- ⚠️ No built-in web UI (use external clients)
121+
- ⚠️ Minimal access control (file-based permissions)
122+
- ⚠️ No collaborative features (no shared calendars with ACLs)
123+
124+
---
125+
126+
## Baikal (https://sabre.io/baikal/)
127+
128+
**Version Tested**: 0.9.x
129+
**Test Date**: 2025-10-09
130+
**Test Result**: 100% PASS (22/22 tools, 1977ms total)
131+
132+
### Strengths
133+
-**Excellent performance** - Slightly faster than Radicale
134+
-**Web UI included** - User management and calendar creation via browser
135+
-**Mature codebase** - Based on sabre/dav (widely used)
136+
-**Perfect CalDAV/CardDAV compliance** - No quirks discovered
137+
138+
### Known Quirks
139+
- 🎉 **None discovered!** All 22 tools work perfectly as expected.
140+
141+
### Performance Benchmarks
142+
143+
| Operation | Avg Time | Notes |
144+
|-----------|----------|-------|
145+
| **Full CRUD cycle** | **~2 seconds** | Excellent performance |
146+
147+
### Recommendations
148+
149+
**Best For**:
150+
- ✅ Small to medium teams (< 200 users)
151+
- ✅ Users who want a simple web UI
152+
- ✅ Production deployments
153+
- ✅ Users migrating from proprietary solutions
154+
155+
**Perfect Score**: ⭐⭐⭐⭐⭐ - Baikal is the most reliable and straightforward CalDAV/CardDAV server tested.
156+
157+
---
158+
159+
## Nextcloud (https://nextcloud.com/)
160+
161+
**Version Tested**: 28.x
162+
**Test Date**: 2025-10-09
163+
**Test Result**: 100% PASS (22/22 tools, 23073ms total)
164+
165+
### Strengths
166+
-**Feature-rich** - Full collaboration suite (files, contacts, calendar, tasks)
167+
-**Active development** - Regular updates and security patches
168+
-**Large community** - Extensive documentation and support
169+
-**Enterprise-ready** - Scales to thousands of users
170+
171+
### Known Quirks
172+
173+
#### 1. Slower Performance
174+
**Severity**: Low
175+
**Impact**: Response time
176+
177+
**What Happens**:
178+
- Full CRUD cycle takes ~23 seconds (vs ~2 seconds for Radicale/Baikal)
179+
- Individual operations are slower (300-500ms vs 100-200ms)
180+
181+
**Why It Happens**:
182+
- Nextcloud is a full application suite, not just CalDAV/CardDAV
183+
- Additional database queries for permissions, logging, notifications
184+
- More complex architecture with plugins and apps
185+
186+
**Workaround**: None needed - performance is still acceptable for most use cases.
187+
188+
---
189+
190+
#### 2. Soft Delete Behavior
191+
**Severity**: Low
192+
**Impact**: None (actually beneficial)
193+
194+
**What Happens**:
195+
- When you delete an event, Nextcloud doesn't immediately remove the file
196+
- The file is renamed to `deleted_event_123.ics` and moved to trash
197+
- Users can restore deleted items from the web UI
198+
199+
**Why It Happens**:
200+
- Nextcloud provides trash/restore functionality
201+
- This is a feature, not a bug
202+
203+
**Workaround**: None needed - tsdav handles this transparently.
204+
205+
---
206+
207+
### Performance Benchmarks
208+
209+
| Operation | Avg Time | Notes |
210+
|-----------|----------|-------|
211+
| list_calendars | ~500ms | Slower due to permissions checks |
212+
| create_event | ~800ms | Includes notification system |
213+
| calendar_query | ~700ms | Complex filtering |
214+
| **Full CRUD cycle** | **~23 seconds** | Slowest, but feature-rich |
215+
216+
### Recommendations
217+
218+
**Best For**:
219+
- ✅ Organizations needing full collaboration suite
220+
- ✅ Teams with existing Nextcloud infrastructure
221+
- ✅ Users who need web-based calendar/contact management
222+
- ✅ Enterprise deployments (1000+ users)
223+
224+
**Considerations**:
225+
- ⚠️ Slower than lightweight alternatives
226+
- ⚠️ More complex setup and maintenance
227+
- ⚠️ Higher resource requirements
228+
229+
---
230+
231+
## iCloud (Apple)
232+
233+
**Status**: Known to work (not tested in this session)
234+
**Auth**: Basic Auth with App-Specific Password
235+
236+
### Known Requirements
237+
- ⚠️ **App-Specific Password required** - Cannot use regular Apple ID password
238+
- ⚠️ **Two-Factor Authentication must be enabled**
239+
- ⚠️ **X-APPLE-CALENDAR-COLOR extension** - Custom color format
240+
241+
### Setup Instructions
242+
1. Enable Two-Factor Authentication on Apple ID
243+
2. Generate App-Specific Password at https://appleid.apple.com/
244+
3. Use App-Specific Password in `CALDAV_PASSWORD` env var
245+
246+
---
247+
248+
## Google Calendar
249+
250+
**Status**: Not yet supported (requires OAuth2)
251+
**Planned**: Phase 11.1 (v2.3.0+)
252+
253+
### Known Requirements
254+
- ⚠️ **OAuth2 required** - Basic Auth not supported
255+
- ⚠️ **UID filename enforcement** - Event filename must match UID
256+
- ⚠️ **No UID reuse** - Cannot reuse UIDs of deleted events
257+
258+
### Workarounds (when OAuth2 is implemented)
259+
- tsdav handles UID extraction and filename generation automatically
260+
- No manual workarounds needed
261+
262+
---
263+
264+
## Summary & Recommendations
265+
266+
### For Personal Use
267+
**Recommendation**: **Radicale** or **Baikal**
268+
- Fastest performance
269+
- Simple setup
270+
- Perfect compatibility
271+
272+
### For Small Teams (5-50 users)
273+
**Recommendation**: **Baikal**
274+
- Built-in web UI
275+
- User management
276+
- Excellent performance
277+
278+
### For Organizations (50+ users)
279+
**Recommendation**: **Nextcloud**
280+
- Full collaboration suite
281+
- Enterprise features
282+
- Active development
283+
284+
### For Public Services
285+
**Recommendation**: Consider OAuth2 providers (Google, Microsoft 365)
286+
- Better security (no password storage)
287+
- Familiar to end users
288+
- Requires Phase 11.1 (OAuth2 support)
289+
290+
---
291+
292+
## Testing Methodology
293+
294+
All tests performed with:
295+
- **Test Suite**: `tests/integration/comprehensive-test.js`
296+
- **Test Duration**: ~2 minutes per server
297+
- **Test Coverage**: 22 tools (12 CalDAV + 7 CardDAV + 6 VTODO) - 3 tools removed (free_busy_query, is_collection_dirty)
298+
- **Operations Tested**:
299+
- CREATE (calendars, events, contacts, todos)
300+
- READ (list, query, multi-get)
301+
- UPDATE (calendar properties, event data, contact data, todo status)
302+
- DELETE (all resource types)
303+
304+
**Success Criteria**:
305+
- ✅ Tool executes without errors
306+
- ✅ Created resources are immediately queryable
307+
- ✅ Updates are reflected in subsequent queries
308+
- ✅ Deletes remove resources permanently
309+
310+
---
311+
312+
## Contributing
313+
314+
Found a new quirk or tested a new provider? Please contribute!
315+
316+
1. Test the provider with the comprehensive test suite
317+
2. Document any unexpected behavior
318+
3. Include workarounds if available
319+
4. Submit a pull request or issue with your findings
320+
321+
---
322+
323+
**Last Updated**: 2025-10-09
324+
**Version**: v2.3.0

0 commit comments

Comments
 (0)