内存日历调度服务器

Tempo是一个快速的内存日历MCP服务器,为LLM提供结构化的事件调度能力,包括冲突检测、多日历支持和提案工作流。

  • by jacob-meacham
  • Rust
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 jacob-meacham/tempo-mcp

使用说明

节奏

一个闪电般快速的内存日历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

提案是一流的该模型可以创建候选计划,将其与现有事件进行核对,并仅在满意时提交,在准备就绪之前不进行任何修改。

推荐的三步工作流程

  1. 负载 所有日历 load_ical, load_json,或 load_google_calendar (并行调用正常)
  2. 查找插槽 和 find_available_slots 使用 buffer_minutes 用于旅行/过渡时间
  3. 提交 和 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 从选项中选择 困难 多种日历配置

许可证

麻省理工学院