Nextcloud CalDAV MCP服务器
MCP(模型上下文协议)服务器,允许Claude通过CalDAV在Nextcloud中创建日历事件和任务。
暴露的工具:
| 工具 | 说明 |
|---|---|
create_event | 写a VEVENT 进入Nextcloud日历 |
create_todo | 写a VTODO 进入Nextcloud任务 |
堆栈: Python 3· mcp SDK 1.x· caldav ·uvicorn·尾鳞片漏斗(HTTPS)
______________________________________________________________________
先决条件
在Proxmox主机(Debian/Ubuntu)上安装:
apt update
apt install -y python3 python3-venv python3-pip git不需要nginx,也不需要certbot——Tailscale会自动处理TLS。
______________________________________________________________________
1--部署服务器文件
# Files already live in /root/calendar_todo_mcp
# Copy the service file to systemd
mkdir -p /root/calendar_todo_mcp
cp server.py requirements.txt calendar_todo_mcp.service /root/calendar_todo_mcp/______________________________________________________________________
2-Python虚拟环境
python3 -m venv /root/calendar_todo_mcp/venv
/root/calendar_todo_mcp/venv/bin/pip install --upgrade pip
/root/calendar_todo_mcp/venv/bin/pip install -r /root/calendar_todo_mcp/requirements.txt______________________________________________________________________
3--配置 .env
cp /root/calendar_todo_mcp/.env.example /root/calendar_todo_mcp/.env
nano /root/calendar_todo_mcp/.env # or your preferred editor
chmod 600 /root/calendar_todo_mcp/.env需要填写的值:
| 变量 | 示例 | 注释 |
|---|---|---|
NEXTCLOUD_URL | https://cloud.example.com | 无尾随斜线 |
NEXTCLOUD_USER | youruser | 您的登录用户名 |
NEXTCLOUD_APP_PASSWORD | xxxx-xxxx-xxxx | 请参阅下面的步骤 |
CALENDAR_NAME | Personal | Nextcloud日历中的确切显示名称 |
TASKS_CALENDAR_NAME | Tasks | Nextcloud任务中的确切显示名称 |
OAUTH_CLIENT_ID | calendar-todo-client | 您选择的任何标识符 |
OAUTH_CLIENT_SECRET | *(生成)* | 快跑 python3 -c "import secrets; print(secrets.token_urlsafe(32))" |
RESOURCE_SERVER_URL | https://mymachine.tail-abc123.ts.net | 您的Tailscale漏斗URL(见步骤4) |
创建Nextcloud应用程序密码
- 登录Nextcloud→ 设置 → 安全
- 滚动到 应用密码 → 输入名称(例如。
mcp-server) → click 生成新的应用程序密码 - 将密码复制到
NEXTCLOUD_APP_PASSWORD
______________________________________________________________________
4 — 设置尾部缩放
安装Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up当链接出现时,请在浏览器中使用您的Tailscale帐户登录。
在 Tailscale 控制台中启用 MagicDNS 和 HTTPS
- 打开 登录.tailscale.com/admin/dns
- 魔法。 激活
- HTTPS证书 激活
启用漏斗(通过HTTPS公开访问)
Tailscale Funnel 可通过公共 Internet 访问服务器 — Claude.ai (Cloud) 需要访问 MCP 服务器。
随附的 tailscale_funnel.service 启动时自动启动漏斗(参见步骤5)。提前测试:
tailscale funnel 8000然后确定您的服务器的URL:
tailscale funnel status
# Ausgabe z.B.: https://mymachine.tail-abc123.ts.net/ proxies to http://127.0.0.1:8000此HTTPS主机名(例如: https://mymachine.tail-abc123.ts.net)als RESOURCE_SERVER_URL 在模具中 .env 注册 。
只在Tailnet(没有公共访问)? 如果 Claude Desktop 在同一台设备上运行, 足够tailscale serve 8000而非funnel.
______________________________________________________________________
5--安装并启动systemd服务
两个服务文件都需要复制和启用:MCP服务器和Tailscale漏斗。
# MCP server
cp /root/calendar_todo_mcp/calendar_todo_mcp.service \
/etc/systemd/system/calendar-todo-mcp.service
# Tailscale Funnel (keeps the funnel running across reboots)
cp /root/calendar_todo_mcp/tailscale_funnel.service \
/etc/systemd/system/tailscale-funnel-mcp.service
systemctl daemon-reload
systemctl enable --now calendar-todo-mcp
systemctl enable --now tailscale-funnel-mcp
# Verify both are running
systemctl status calendar-todo-mcp
systemctl status tailscale-funnel-mcp
journalctl -u calendar-todo-mcp -f______________________________________________________________________
6--烟雾测试
替换 mymachine.tail-abc123.ts.net 使用您的实际Tailscale URL:
# OAuth-Metadaten-Endpoint — sollte JSON mit issuer/scopes zurückgeben
curl https://mymachine.tail-abc123.ts.net/.well-known/oauth-protected-resource \
| python3 -m json.tool
# MCP-Endpoint ohne Token — sollte 401 zurückgeben
curl -s -o /dev/null -w "%{http_code}" \
https://mymachine.tail-abc123.ts.net/mcp______________________________________________________________________
7--连接克劳德
在 Claude.ai 中的 MCP 服务器或 claude_desktop_config.json 注册:
{
"mcpServers": {
"calendar-todo": {
"url": "https://mymachine.tail-abc123.ts.net/mcp"
}
}
}Claude 在第一次连接时自动启动 OAuth 流(浏览器重定向)。之后,不需要进一步配置。
Claude可以这样说:
*“3点给我找牙医。4月10点45分钟“* *提醒:打电话给银行,明天到期*
______________________________________________________________________
运营
# View live logs
journalctl -u calendar-todo-mcp -f
# Restart after config changes
systemctl restart calendar-todo-mcp
# Stop / disable
systemctl stop calendar-todo-mcp
systemctl disable calendar-todo-mcp______________________________________________________________________
故障排除
| 问题 | 检查什么 |
|---|---|
401 Unauthorized | OAuth 流程尚未完成 — 重新连接 Claude 并在浏览器中确认授权 |
Calendar 'X' not found | The CALENDAR_NAME / TASKS_CALENDAR_NAME 必须匹配 确切的显示名称 Nextcloud |
CalDAV 401 | 应用程序密码输入正确吗?用户是否启用了CalDAV访问? |
Connection refused | 服务是否正在运行? systemctl status calendar-todo-mcp |
尾秤 502 Bad Gateway | MCP服务器未运行或错误 PORT 在 .env |
Funnel 没有回应。 tailscale funnel status 检查;的ggf。 tailscale funnel 8000 再次执行 | |
| Tailscale HTTPS 无法运行 | Tailscale 管理控制台中启用 MagicDNS 和 HTTPS 证书? |
