使用说明
日历MCP服务器
用于iCalendar提要管理和事件查询的模型上下文协议(MCP)服务器。此服务器使Claude Desktop和其他MCP客户端能够与多个日历提要进行交互,以进行事件跟踪、冲突检测和日程管理。
特性
- 多日历支持:监视多个iCalendar源(.ics URL)
- 智能事件查询:按日期、范围或关键字搜索事件
- 冲突检测:具有严重性级别的高级冲突分析
- 动态饲料管理:动态添加/删除日历提要
- 自动刷新:订阅源更新的可配置刷新间隔
- 时区支持:适当的时区规范化和处理
- Redis缓存:可选缓存以提高性能
- HTTP API:通过HTTP进行远程访问,采用双因素身份验证
快速开始
Docker部署
对于生产HTTP访问:
# 1. Configure environment
cp .env.example .env.local
# Edit .env.local: set ICAL_FEED_CONFIGS and MCP_API_KEY
# 2. Run with Docker Compose
docker-compose up --build
# 3. Calculate your endpoint URLs
python scripts/verify_auth.py --api-key YOUR_KEY --domain localhost:8080 --no-https
# 4. Access endpoints
# Health (public): http://localhost:8080/app/health
# MCP: http://localhost:8080/app/{API_KEY}/{API_KEY_HASH}/mcp
配置
环境变量
必修的:
ICAL_FEED_CONFIGS-日历提要的JSON数组
可选:
TIMEZONE-IANA时区名称(默认值:UTC)REFRESH_INTERVAL-刷新间隔分钟数(默认值:60)DEBUG-启用调试日志记录(默认值:false)
HTTP模式:
MCP_API_KEY-用于身份验证的API密钥(强烈推荐)MD5_SALT-MD5哈希的盐(可选,建议增强安全性)HOST-绑定地址(默认值:0.0.0.0)PORT-侦听端口(默认:80)
Redis缓存(可选):
REDIS_HOST-Redis主机名REDIS_SSL_PORT-Redis SSL端口(默认:6380)REDIS_KEY-Redis访问密钥
日历源格式
[
{
"name": "Work",
"url": "https://calendar.google.com/calendar/ical/YOUR_ID/basic.ics"
},
{
"name": "Personal",
"url": "https://outlook.office365.com/owa/calendar/YOUR_ID/calendar.ics"
}
]
获取日历源URL
谷歌日历:
- 打开谷歌日历设置
- 选择日历→ “集成日历”
- 复制“iCal格式的秘密地址”
Outlook日历:
- 日历设置→ “共享日历”
- 发布日历
- 复制ICS链接
苹果日历:
- 右键单击日历→ “共享日历”
- 公开并复制URL(更改
webcal://到https://)
部署
带有HTTP API的Docker
docker-compose up --build
入口点: server_remote.py
端口: 8080
身份验证: 双因子路径(API密钥+MD5哈希)
认证
服务器使用 双因素路径认证 需要API密钥及其MD5散列:
https://your-domain.com/app/{API_KEY}/{API_KEY_HASH}/mcp
哈希值计算如下 MD5(MD5_SALT + API_KEY) 当盐被配置时,或 MD5(API_KEY) 在传统模式下。
生成端点URL
Python脚本(推荐):
python scripts/verify_auth.py --api-key YOUR_KEY --domain your-domain.com
Bash脚本:
scripts/get_mcp_url.sh YOUR_KEY your-domain.com
手动计算:
import hashlib
api_key = "your-api-key"
md5_salt = "your-salt" # Optional
hash_input = f"{md5_salt}{api_key}" if md5_salt else api_key
api_key_hash = hashlib.sha256(hash_input.encode()).hexdigest()
print(f"https://domain.com/app/{api_key}/{api_key_hash}/mcp")
安全特性
防暴力保护:
- 无效的身份验证路径在返回404之前会触发30秒的延迟
- 这使得暴力攻击变得不切实际(例如,测试1000个密钥需要8个多小时)
- 健康检查端点(
/app/health)免于延误 - 用源IP记录失败的尝试以进行监视
最佳实践:
- 使用强API密钥(32+字节,使用
openssl rand -base64 32) - 配置
MD5_SALT用于附加安全层 - 监视重复失败的身份验证尝试的日志
- 考虑在反向代理上进行基于IP的速率限制
- 在生产环境中始终使用HTTPS以防止凭据被拦截
可用端点
- 健康 (
/health):健康检查(公开,无需身份验证) - 主控程序 (
/app/{KEY}/{HASH}/mcp):MCP协议端点(经过身份验证)
证券收益
- 双因素保护:需要API密钥和哈希
- 哈希值未存储:运行时计算的哈希
- 路径混淆:即使有一个因素,端点也无法访问
- 无令牌交换:无状态身份验证
可用的MCP工具
事件查询
get_events_today-获取今天的所有活动get_tomorrow_events-获取明天的活动get_week_events-获取本周活动get_month_events-获取本月活动get_upcoming_events-获取即将到来的活动(未来7天)get_events_on_date-获取特定日期的事件get_events_between_dates-获取日期范围内的事件get_events_after_date-获取特定日期后的事件search_calendar_events-按关键字搜索事件
冲突检测
get_calendar_conflicts-检测日历之间的日程安排冲突
饲料管理
refresh_calendar_feeds-手动刷新所有订阅源get_calendar_info-获取有关已配置提要的信息get_calendar_feeds-列出所有已配置的订阅源
注: 日历订阅源是通过以下方式配置的
ICAL_FEED_CONFIGS环境变量。要添加或删除提要,请更新配置并重新启动服务器。
服务器管理
get_current_datetime-获取配置时区中的当前日期/时间get_server_status-检查服务器运行状况get_server_config-查看服务器配置
缓存管理(如果配置了Redis)
get_cache_stats-查看缓存性能指标get_cache_info-查看Redis服务器信息clear_cache-清除缓存数据reset_cache_stats-重置缓存统计信息
安全
最佳实践
1.生成强大的API密钥:
openssl rand -base64 32 # Minimum 32 bytes recommended
2.在生产中使用HTTPS:
- 配置TLS/SSL证书
- 在入口中启用SSL重定向
- 使用证书管理器自动续订
3.安全存储:
- ✅ 存储在环境变量或Docker secrets中
- ✅ 使用外部秘密管理(Vault、AWS Secrets Manager)
- ✅ 加密静态秘密
- ❌ 从不承诺版本控制
- ❌ 从不记录API密钥
4.网络安全:
- 使用防火墙规则限制访问
- 考虑使用具有额外身份验证的反向代理
- 使用有效的SSL证书启用HTTPS
5.费率限制:
- 在反向代理级别配置速率限制
- 使用nginx限速或fail2ban等工具
安全标头
服务器会自动添加安全标头:
X-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockReferrer-Policy: no-referrerCache-Control: no-store, no-cache, must-revalidate, private
访问日志被禁用以防止API密钥泄漏。
关键点旋转
如果API密钥被泄露:
# 1. Generate new key and salt
NEW_KEY=$(openssl rand -base64 32)
NEW_SALT=$(openssl rand -base64 32)
# 2. Update .env.local file
echo "MCP_API_KEY=$NEW_KEY" >> .env.local
echo "MD5_SALT=$NEW_SALT" >> .env.local
# 3. Restart the Docker container
docker-compose down
docker-compose up -d
# 4. Get new endpoint URLs
python scripts/verify_auth.py --api-key "$NEW_KEY" --md5-salt "$NEW_SALT" --domain your-domain.com
# 5. Update MCP clients with new URLs
生产检查表
- []生成了强MCP_API_KEY(32个字节以上)
- []已配置MD5_SALT以增强安全性
- []配置了有效证书的HTTPS/TLS
- []在反向代理上启用SSL重定向
- []已配置证书自动续订
- []已配置防火墙规则
- []在反向代理上配置了速率限制
- []保护环境变量
- []已配置监控和警报
- []已制定关键轮换计划
- []已测试备份和恢复
- []已启用安全扫描
- []定期审查访问日志
测试
使用Claude Desktop进行测试
“我的日历服务器的状态如何?” “我今天有什么活动?” “显示我下周的日程安排” “我这个月有日程安排冲突吗?”
测试HTTP端点
# Calculate endpoint URLs (with salt for enhanced security)
python scripts/verify_auth.py --api-key "$MCP_API_KEY" --md5-salt "$MD5_SALT" --domain localhost:8080 --no-https
# Or using environment variables
export MCP_API_KEY="your-api-key"
export MD5_SALT="your-salt"
python scripts/verify_auth.py --domain localhost:8080 --no-https
# Test health check (public endpoint)
curl http://localhost:8080/app/health
故障排除
“未配置iCalendar订阅源”
确保 ICAL_FEED_CONFIGS 使用有效的JSON正确设置。
订阅源未更新
- 检查订阅源URL是否可公开访问
- 验证URL是否返回有效的iCalendar数据
- 尝试手动刷新:
refresh_calendar_feeds工具 - 检查
REFRESH_INTERVAL设置
时区问题
- 确保日历提要包含时区信息
- 服务器将时区标准化为UTC
- 集
TIMEZONE环境变量
JSON解析错误
- 在中验证JSON格式
ICAL_FEED_CONFIGS - 在环境变量中JSON周围使用单引号
- 正确转义双引号
容器无法启动
# Check container logs
docker logs calendar-mcp
# Common causes:
# - Missing ICAL_FEED_CONFIGS
# - Invalid JSON in ICAL_FEED_CONFIGS
# - Missing MCP_API_KEY (HTTP mode)
建筑
MCP Client
↓ (HTTP)
Docker Container
↓
MCP Server (FastMCP)
└─ server_remote.py (HTTP API)
↓
Calendar Service (services/ical.py)
├─ Feed Parser (icalendar)
├─ Recurring Events (recurring-ical-events)
└─ Auto-Refresh Timer
↓
Optional Redis Cache (services/cache.py)
↓
iCalendar Feed URLs
演出
- 自动缓存:缓存解析事件以减少处理
- 背景刷新:无阻塞地馈送刷新
- Redis支持:用于多实例部署的可选Redis
- 高效解析:仅在提要更改时解析
发展
看 代理商.md 详细的开发文档,包括:
- 建筑细部
- 服务模式
- 测试指导
- 添加新功能
- 常见陷阱
许可证
本项目按原样提供供个人使用。
支持
- 问题:打开GitHub问题
- 安全:私下报告漏洞
- iCalendar规格: https://icalendar.org/