使用说明
节奏
一个闪电般快速的内存日历MCP服务器,为LLM提供了超级调度能力。
LLM不擅长复杂的日程安排。他们产生了冲突的幻觉,对反复发生的事件失去了追踪,并且无法可靠地推断重叠的时间范围。Tempo通过为任何兼容MCP的模型提供结构化的解决方案来解决这个问题 提出检查承诺 工作流——这样它就可以加载真实的日历、查找打开的插槽、提出事件、验证零冲突,并且只在所有内容都检查出来时提交。在stdio上仅作为单个Rust二进制文件运行。
为什么是Tempo?
LLM的日程安排看似困难:
- 密集日历 20多个事件会导致上下文过载和遗漏冲突
- 周期性事件 (每日站立,每周1:1s)需要扩展以检查重叠情况
- 多日历意识 (工作+个人)意味着在不同的事件集之间进行推理
- 缓冲时间 (旅行、上下文切换)增加了无形的约束
Tempo将所有这些都卸载到专门制造的引擎中。该模型调用工具而不是做心算,并得到确定性的答案而不是最佳猜测。
快速入门
构建
cargo build --release
添加到您的MCP客户端
Claude Desktop
添加 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"tempo": {
"command": "/absolute/path/to/tempo-mcp/target/release/tempo-mcp"
}
}
}
Claude Code
claude mcp add tempo /absolute/path/to/tempo-mcp/target/release/tempo-mcp
用它
“这是我本周的日历(粘贴iCal或JSON)。安排三个1小时的焦点块,避免冲突,会议之间有15分钟的缓冲时间。”
Tempo处理其余的事情——该模型将加载您的事件,查找打开的插槽,并提出一个无冲突的时间表。
运作原理
Tempo使 重新测试工作流程 其中模型在提交之前迭代调度决策:
Load calendars ──> Query availability ──> Propose events ──> Check conflicts ──> Commit
│ │ │
│ └── Adjust & retry ──┘
│
iCal / JSON / Google Calendar
提案是一流的该模型可以创建候选计划,将其与现有事件进行核对,并仅在满意时提交,在准备就绪之前不进行任何修改。
推荐的三步工作流程
- 负载 所有日历
load_ical,load_json,或load_google_calendar(并行调用正常) - 查找插槽 和
find_available_slots使用buffer_minutes用于旅行/过渡时间 - 提交 和
propose_and_commit--提出、冲突检查和原子提交
工具
水合作用——加载现有事件
| 工具 | 说明 |
|---|---|
load_ical |
从iCal/ICS格式加载事件(支持RRULE重复) |
load_json |
从JSON数组加载事件 |
load_google_calendar |
直接从Google日历API格式加载事件 |
查询——了解日程安排
| 工具 | 说明 |
|---|---|
list_events |
列出一个时间范围内的所有事件(重复事件展开) |
get_free_busy |
用总计获取繁忙/空闲时段 |
find_available_slots |
查找给定持续时间的开放插槽,并可选择缓冲时间 |
提案——满怀信心地安排
| 工具 | 说明 |
|---|---|
propose_events |
在不提交的情况下创建命名提案 |
check_conflicts |
根据现有事件验证提案 |
list_proposals |
查看所有待处理的提案 |
withdraw_proposal |
放弃提案 |
propose_and_commit |
一步提出+冲突检查+提交 (推荐) |
突变--直接日历编辑
| 工具 | 说明 |
|---|---|
commit_proposal |
提交之前创建的提案 |
add_event |
直接添加单个事件(绕过提案工作流) |
remove_event |
按ID删除事件 |
clear_calendar |
从日历中删除所有事件 |
导出--获取结果
| 工具 | 说明 |
|---|---|
export_ical |
导出为iCal/ICS字符串 |
export_json |
导出为JSON数组 |
多日历支持
Tempo支持多个命名日历(例如,“工作”、“个人”)。日历名称不区分大小写,并在首次使用时自动创建。
- 读取操作 没有指定日历查询 全部 日历
- 写入操作 默认为
"default"日历 - 冲突检查可以跨越所有日历,因此提案会根据您的整个日程进行验证
发展
cargo build # compile (debug)
cargo build --release # compile (optimized — use this for evals)
cargo test # run all 44 unit tests
cargo clippy # lint (zero warnings)
撤离
Tempo附带了一个基准套件,用于比较裸Claude和Claude+Tempo在硬调度任务上的表现。七个场景测试了日益增加的复杂性——从有5个会议的轻松一周到有重复事件和限制的密集多日历设置。
运行评估
# Setup
cd evals
python -m venv .venv && source .venv/bin/activate
pip install -e .
cp ../.env.example ../.env # add your ANTHROPIC_API_KEY
# Build the server (evals require the release binary)
cargo build --release
# Run
python run_eval.py # all scenarios, bare vs. MCP
python run_eval.py --mode mcp # MCP only
python run_eval.py --scenario 02 # specific scenario
python run_eval.py --model claude-sonnet-4-20250514
评分
每次跑步得分为0-100分:
| 尺寸 | 重量 | 测量值 |
|---|---|---|
| 正确性 | 40% | 与现有事件无冲突 |
| 完整性 | 25% | 所有请求的块都已实际调度 |
| 约束遵守 | 20% | 满足自定义规则(时间窗口、缓冲区、扩散) |
| 效率 | 15% | 完美正确性+完整性奖励 |
结果
《裸克劳德十四行诗4》与《克劳德十四行诗4+节奏》(综合评分,0-100):
| 场景 | 裸露 | +节奏 | 冲突(裸露→ MCP) |
|---|---|---|---|
| 01-简单日程安排 | 100.0 | 100.0 | 0→ 0 |
| 02--密历 | 45.0 | 98.4 | 7→ 0 |
| 03--重复事件迷宫 | 61.0 | 100.0 | 3→ 0 |
| 04--多日历 | 52.9 | 98.7 | 4→ 0 |
| 05--约束重 | 99.8 | 100.0 | 0→ 0 |
| 06--真实世界的谷歌Cal | 54.7 | 100.0 | 3→ 0 |
| 07--从选项中选择 | 71.5 | 100.0 | 1→ 0 |
| 平均 | 69.3 | 99.6 | 18 → 0 |
Tempo完全消除了日程安排冲突,将平均综合得分从69分提高到99.6分。裸模型在密集日历(场景02)和多源协调(场景04,06)上最为困难,因为它必须对20多个事件进行推理。
场景
| # | 场景 | 难度 | 测试内容 |
|---|---|---|---|
| 01 | 简单的日程安排 | 简单 | 5个活动,安排3个焦点块 |
| 02 | 密集日历 | 硬 | 20多个活动,安排6个街区 |
| 03 | 反复发生的冲突 | 艰难 | 每日站立,每周1:1s |
| 04 | 多日历 | 辛苦 | 工作+个人日历 |
| 05 | 约束重 | 困难 | 时间窗口,没有背靠背,午餐缓冲 |
| 06 | 现实世界 | 硬 | 混合时区,谷歌日历JSON |
| 07 | 从选项中选择 | 困难 | 多种日历配置 |
许可证
麻省理工学院