Commit Graph

10 Commits

Author SHA1 Message Date
Stefan Lohmaier 80fc323374 Fix XML namespace handling for Radicale responses
Radicale uses default DAV: namespace (no d: prefix) and CR: for CardDAV
instead of c:. Fixed all regex patterns to handle both variants:
- <href> and <d:href>
- <displayname> and <d:displayname>
- <CR:address-data> and <c:address-data>
- <C:calendar-data> and <c:calendar-data>
- </response> and </d:response>

Also fixed calendar discovery to match <C:calendar/> resourcetype
instead of looking for VEVENT string in the response.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 10:17:14 +02:00
Stefan Lohmaier 45cd6935fb Security: verify client_secret in authorization_code flow + shared token store
- Token exchange now requires valid client_secret (was missing)
- Access tokens stored in shared .active_tokens.json (cross-process)
- nginx rate limiting on /authorize and /token (10r/m, burst=5)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 09:34:18 +02:00
Stefan Lohmaier 30351f1bcf Switch to per-service subdomains, shared token store
URLs: mail.mcp.home.slohmaier.de, calendar.mcp..., etc.
No more path-prefix routing — each service has its own domain.
OAuth tokens stored in shared .active_tokens.json file so all
services can validate tokens issued by any service.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 09:13:54 +02:00
Stefan Lohmaier 7f0b03606a Add OAuth Authorization Code flow with PKCE for claude.ai
claude.ai uses the full OAuth Authorization Code flow, not client_credentials.
Flow: GET /authorize → auto-approve → redirect with code → POST /token
with code + code_verifier (PKCE S256).

Also fixes OAuth metadata URLs to use correct external scheme/host/prefix
via X-Forwarded-Proto, Host, and X-Forwarded-Prefix headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 08:48:34 +02:00
Stefan Lohmaier 1f98695821 Add create_draft tool to Mail server
Creates email drafts via IMAP APPEND to the Drafts folder.
Supports Stefan (1blu, Drafts folder) and Kati (Gmail, Entwürfe).
Draft can be reviewed and sent from Roundcube or phone.

IMAP credentials externalized to config.json.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 08:16:53 +02:00
Stefan Lohmaier 5190e8c849 Add write_file, create_folder, delete_file, move_file to Files server
Full CRUD for oCIS files:
- write_file: text or base64 binary content
- create_folder: MKCOL
- delete_file: DELETE (files and folders)
- move_file: MOVE (rename or relocate)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 08:08:08 +02:00
Stefan Lohmaier b88adc4c50 read_file: pass binary documents as EmbeddedResource
PDF, docx, xlsx, pptx etc. are returned as EmbeddedResource with
BlobResourceContents (base64 + mimeType). claude.ai processes these
client-side, same as Google Drive/Dropbox MCP connectors.

Fallback chain: text → image → embedded resource (binary).
MIME type guessed from extension when server returns octet-stream.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 08:02:32 +02:00
Stefan Lohmaier a9359beead Add image support to Files and contact photos to Contacts
Files:
- read_file returns images inline (jpg/png/gif/webp up to 10MB)
- Text files returned as text, binary files as metadata only

Contacts:
- get_contact includes contact photo as inline image if available
- New tool: set_contact_photo (base64 jpeg/png → VCard PHOTO)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 07:53:55 +02:00
Stefan Lohmaier 924366ac6c Add travel time, geocoding, and reminders to create_event
- travel_minutes: shows as gray block before event on iPhone
- location geocoding via Nominatim → X-APPLE-STRUCTURED-LOCATION with geo coords
- reminder_minutes: VALARM trigger before event
- Also externalized all credentials to config.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 07:28:00 +02:00
Stefan Lohmaier fb642e47c8 Initial commit: 5 MCP servers for Mail, Calendar, Contacts, Files, Notes
Self-hosted MCP servers with OAuth client_credentials auth.
Each server connects to a different backend:
- Mail: reads Maildir IMAP backups
- Calendar/Tasks: CalDAV against Radicale
- Contacts: CardDAV against Radicale
- Files: WebDAV against oCIS
- Notes: Joplin REST API

Credentials externalized to config.json (not in repo).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-12 06:22:42 +02:00