Files
hermes-caldav-mcp/docs/verification.md
xeno 93b9c9f913
Some checks failed
Offline checks / test (3.11) (push) Has been cancelled
Offline checks / test (3.13) (push) Has been cancelled
feat: publish Hermes Nextcloud calendar MCP under AGPL-3.0
2026-09-30 20:27:25 +00:00

22 lines
4.9 KiB
Markdown

# Verification record
Verified on 2026-09-30 using synthetic data only:
- 231 tests passed on Python 3.11.9 and Python 3.13.15, including a clean temporary wheel installation from the frozen dependency graph.
- Real official SDK stdio initialization, five closed-schema tools, read/create/edit calls and error envelopes passed. Legacy MCP protocol `2025-03-26` negotiation passed.
- Creation examples published in discovery were executed over real stdio for named timezones, UTC and all-day dates. Each event was read, edited using the published revision-based title-edit example, and read again to verify that its times were preserved. Installed Hermes preserved the descriptions, field guidance and examples through provider schema conversion and deferred `tool_describe`. This guidance uses only generic examples and never depends on a loaded credential profile.
- A separate compatibility check with MCP SDK 2.0 completed discovery, read, create and edit against the synthetic fixture server; the package itself uses locked SDK 2.2.
- Loopback TLS checks rejected an untrusted certificate and a hostname mismatch before sending authentication; a configured private CA succeeded with ambient proxies disabled.
- Credential failure, destination/encoding/method restrictions, XML/size/occurrence limits, safe text serialization, recurrence/alarm/custom-property preservation, ETag conflicts and uncertain write outcomes were exercised.
- Wallet detection, desktop recommendations, installed/inactive/locked providers, named GNOME/KDE and older KDE aliases, explicit selection and per-profile persistence were exercised. A synthetic D-Bus boundary with real SecretStorage session negotiation, encryption and decryption verified that changing the generic provider does not split a credential operation across wallets. Missing selected wallets and changed generic-provider executable identities failed before secret retrieval. Restricted metadata files, corrupt/symlink/oversized preferences, canceled/failed enrollment, selected-provider removal and partial preference-write recovery were checked. No dependencies were added for wallet selection.
- Guided setup exercised timezone detection/city search, browser-address normalization, in-place input correction, explicit calendar ranges, review changes, cancellation before saving, reuse of saved accounts/timezones, hidden-password refusal and retry after a discovery deadline. No additional runtime dependencies were added.
- Storage checks exercised exact-collection mapping, known GNOME encrypted/plaintext headers, old/current KWallet encryption identifiers, unknown formats and versions, missing files, symlinks and FIFOs. Encrypted KWallet format never implies a nonempty password. Explicit unverified-storage enrollment still rejects unencrypted IPC. Guided password setup and default-off overrides were checked without retrieving live secrets.
- Hermes registration exercised conflict refusal, changed target paths, malformed/symlink configurations, idempotency, preservation of unrelated entries, redacted CLI failures, retry without wallet secret access, and honest reporting when enrollment succeeded but registration failed. A separate installed-Hermes check used a temporary synthetic configuration: existing comments, unrelated settings and mode `0600` were preserved, identical registration did not rewrite the file, and MCP tool discovery passed without calendar calls. A read-only KDE provider/header check recognized the current encrypted format while leaving password protection unverified.
- Formatting, lint, dependency compatibility, source/wheel builds and Git whitespace checks passed. A pip-audit check of 38 locked runtime dependencies found no known vulnerabilities at that date. This is not a guarantee about undisclosed vulnerabilities or package trustworthiness.
The implementation author performed the final review. No independent security audit was performed. Regression tests were added for UTC edits under a different profile timezone, ambiguous daylight-saving times, fractional-second truncation, ignored all-day timezone patches, excessive timezone generation and acknowledged/uncertain writes.
Two implementation decisions refine the plan: use the SDK's public low-level Server to advertise only tools, and bound creation of new timezone definitions to 3,660 days. The former requires maintaining a small typed adapter; the latter means unusually long named-zone events need UTC or an existing definition.
Automated verification used synthetic credentials and calendars; it did not enroll real credentials, contact or change a live calendar, or modify the real Hermes configuration. The separate installed-Hermes check modified only its temporary synthetic configuration. Tests cannot establish a particular backend's encryption at rest or a particular Nextcloud deployment's behavior. Complete the private disposable-calendar checks in [setup.md](setup.md) before using important data.