使用说明
MCP-RTM
Remember The Milk集成的模型上下文协议服务器
一个模型上下文协议(MCP)服务器,将AI助手(如Claude)连接到您的Remember The Milk任务,通过任何兼容MCP的客户端实现自然语言任务管理。
这是什么?
该项目通过人工智能助手和Remember The Milk之间的桥梁 模型上下文协议。设置后,您可以:
- 让Claude使用自然语言将任务添加到RTM列表中
- 通过描述任务来完成任务
- 使用筛选器查询您的任务
- 通过对话设置优先级、截止日期、标签并管理任务列表
服务器处理RTM身份验证、时间线管理,并通过标准化的MCP工具和资源公开您的任务数据。
特性
- 🔐 OAuth身份验证 -通过门户网站安全连接RTM帐户
- 🛠️ 30+MCP工具 -RTM API全面覆盖(任务、列表、标签、注释、位置、设置)
- 📚 MCP资源 -对列表、标签和位置数据的只读访问
- 📝 MCP提示 -常见工作流的预配置模板
- 🔔 Webhook支持 -RTM的实时更新(可选)
- 🔄 每用户速率限制 -根据RTM最佳实践自动节流
- 🐳 Docker就绪 -易于部署到铁路或任何集装箱平台
- ⚡ 涡轮增压系统 -用于monorepo开发的快速缓存构建
先决条件
- Node.js 20+
- pnpm 9+
- Docker(用于本地开发)
- 记住牛奶账户
- RTM API密钥 (免费)
快速开始
1.克隆和安装
git clone https://github.com/allen-n/rtm-mcp.git
cd rtm-mcp
pnpm install
2.配置环境
cp .env.example .env
编辑 .env 并添加您的凭据:
# Get these from https://www.rememberthemilk.com/services/api/
RTM_API_KEY=your_api_key_here
RTM_SHARED_SECRET=your_shared_secret_here
# Generate a random secret for BetterAuth
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
# Generate a random secret for webhook verification (optional)
RTM_WEBHOOK_SECRET=$(openssl rand -hex 32)
# Local Postgres defaults (change if you already run Postgres)
POSTGRES_USER=rtm
POSTGRES_PASSWORD=rtm
POSTGRES_DB=rtmdb
POSTGRES_PORT=5433
POSTGRES_SSL=false
中的其余默认值 .env.example (NEXT_PUBLIC_API_BASE, APP_BASE_URL等)已经为当地发展做好了准备。当使用Docker Compose运行时, API_BASE_INTERNAL 在中自动设置 docker-compose.yml.
3.从Docker Compose开始(推荐)
在本地运行最简单的方法是使用Docker Compose,它反映了生产设置:
# Start all services (postgres, migrations, mcp server, web portal)
docker compose up --build
# Or start specific services
docker compose up -d postgres # Just the database
docker compose up --build mcp # MCP server + dependencies
docker compose up --build web # Web portal + dependencies
这将:
- 在端口5432上启动PostgreSQL
- 自动运行数据库迁移
- 启动MCP服务器
http://localhost:8787 - 在上启动门户网站
http://localhost:3000
4.备选方案:本土发展
如果您更喜欢本机运行服务(更快的热重新加载):
# Start just Postgres via Docker
docker compose up -d postgres
# Run migrations
pnpm migrate
# Start all services with Turbo (parallel, cached builds)
pnpm dev
# Or start individual services
pnpm dev:mcp # MCP server only
pnpm dev:web # Web portal only
MCP服务器运行在 http://localhost:8787
门户网站运行在 http://localhost:3000
5.连接您的RTM帐户
- 访问
http://localhost:3000(门户网站) - 使用电子邮件/密码创建帐户
- 点击“Connect RTM”链接您的Remember The Milk帐户
- 在RTM上授权应用程序
- 连接后,您将看到一条成功消息!
6.配置您的MCP客户端(共享JSON)
连接RTM并在仪表板设置中创建API密钥后,对主要MCP客户端使用此配置:
- 克劳德桌面
- 光标
- Cline/Roo代码/风帆
- 继续
{
"mcpServers": {
"rtm": {
"url": "http://localhost:8787/mcp/json",
"headers": {
"x-api-key": "YOUR_API_KEY"
}
}
}
}
在生产中,更换 http://localhost:8787 使用已部署的API基础(例如 https://api.yourdomain.com).
7.使用MCP检查员进行测试
npx @modelcontextprotocol/inspector http://localhost:8787/mcp
项目结构
mcp-rtm/
├── apps/
│ ├── mcp-server/ # MCP server (Hono + MCP SDK)
│ │ ├── src/
│ │ │ ├── mcp.ts # MCP tool/resource definitions
│ │ │ ├── http.ts # HTTP server setup
│ │ │ └── routes/ # Auth & webhook handlers
│ │ ├── Dockerfile # Container build
│ │ └── railway.json # Railway deployment config
│ └── web/ # Next.js web portal
│ ├── Dockerfile
│ └── railway.json
├── packages/
│ ├── auth/ # BetterAuth configuration
│ ├── db/ # Kysely + migrations
│ │ └── Dockerfile # Migrations runner
│ └── rtm-client/ # RTM API client with rate limiting
├── docker-compose.yml # Local development setup
└── turbo.json # Turbo build configuration
认证
此项目使用 BetterAuth 用于身份验证:
- 电子邮件/密码:主要身份验证方法。用户通过门户网站使用电子邮件和密码注册。
- 会话管理:会话持续7天,自动续订。
- API密钥:用于程序化MCP访问(可用于与Claude Desktop或其他MCP客户端集成)。
门户网站处理用户注册和RTM OAuth连接。连接后,用户可以使用其API密钥使用MCP服务器。
OAuth提供者(可选)
支持社交登录(GitHub、Google),但默认情况下禁用。要启用,请取消注释 socialProviders 部分在 packages/auth/src/server.ts 并设置所需的环境变量。
可用的MCP工具
连接后,AI助手可以使用以下工具:
任务管理
| 工具 | 说明 |
|---|---|
get_tasks |
使用RTM筛选器语法检索任务 |
add_task |
创建任务(支持智能添加: !1 ^tomorrow #tag) |
complete_task |
标记任务已完成 |
uncomplete_task |
将已完成的任务标记为未完成 |
delete_task |
永久删除任务 |
rename_task |
更改任务名称 |
move_task |
在列表之间移动任务 |
postpone_task |
将截止日期提前一天 |
任务属性
| 工具 | 说明 |
|---|---|
set_priority |
设置优先级(1=最高,2,3,N=无) |
set_due_date |
设置/清除截止日期(支持自然语言) |
set_start_date |
设置/清除开始日期 |
set_recurrence |
设置重复模式(例如,“每周”) |
set_estimate |
设置时间估计(例如“30分钟”) |
set_url |
将URL附加到任务 |
set_location |
设置任务位置 |
标签
| 工具 | 说明 |
|---|---|
get_tags |
获取您帐户中的所有标签 |
add_tags |
为任务添加标签 |
remove_tags |
从任务中删除标记 |
set_tags |
替换任务上的所有标签 |
备注
| 工具 | 说明 |
|---|---|
add_note |
向任务添加注释 |
edit_note |
编辑现有注释 |
delete_note |
删除注释 |
列表
| 工具 | 说明 |
|---|---|
get_lists |
获取所有列表 |
create_list |
创建新列表(或智能列表) |
rename_list |
重命名列表 |
archive_list |
存档列表 |
delete_list |
永久删除列表 |
其他
| 工具 | 说明 |
|---|---|
get_locations |
获取所有已保存的位置 |
get_settings |
获取用户的RTM设置 |
HTTP端点
MCP协议
POST /mcp-流式HTTP MCP端点(需要Accept: application/json, text/event-stream)POST /mcp/json-不支持SSE的客户端的仅JSON兼容端点
REST API和文档
GET /api/v1/tools-列出所有具有模式的工具POST /api/v1/invoke-按名称调用工具GET /api/v1/skills.md-AI代理的详细使用指南GET /llms.txt-MCP快速使用指南GET /随着Accept: text/markdown(或text/md)-退货llms.txt在web域上GET /api/v1/openapi.json-REST API的OpenAPI规范GET /api/v1/docs-交互式Swagger用户界面
健康与认证
GET /health-健康检查端点GET /rtm/start-启动RTM OAuth流GET /rtm/callback-RTM OAuth回调
发展
构建系统
此项目使用 涡轮 对于快速缓存的构建:
# Build everything (respects dependency order)
pnpm build
# Build specific app
pnpm --filter @apps/mcp-server build
# Run all dev servers in parallel
pnpm dev
运行测试
# Run all tests
pnpm test
# Watch mode
pnpm test:watch
# Test specific package
pnpm --filter @packages/rtm-client test
数据库迁移
# Run pending migrations
pnpm migrate
# Refresh generated Kysely types after schema changes
pnpm --filter @packages/db generate
# Create new migration
# Add new .ts file in packages/db/src/migrations/ with format: <UTC_Timestamp>_description.ts
Docker编写服务
| 服务 | 描述 | 端口 |
|---|---|---|
postgres |
PostgreSQL数据库 | 5432 |
migrations |
运行数据库迁移(之后退出) | - |
mcp |
MCP服务器 | 8787 |
web |
Next.js门户 | 3000 |
# Rebuild and restart a specific service
docker compose up --build mcp
# View logs
docker compose logs -f mcp
# Reset database (delete volume)
docker compose down -v
docker compose up -d postgres
部署(铁路)
此项目旨在部署在 铁路 提供三项服务:
服务配置
| 服务 | 根目录 | 监视模式 |
|---|---|---|
| mcp服务器 | / |
apps/mcp-server/**, packages/** |
| 网络 | / |
apps/web/**, packages/** |
| Postgres | 铁路管理的PostgreSQL |
每个应用程序都有一个 railway.json 配置构建和部署。
环境变量
env-vars在这个项目中是如何工作的
门户网站使用Next.js,它有两类环境变量:
NEXT_PUBLIC_*谁 被内联到客户端JavaScript包中 构建时间。他们必须出席next build跑。在Dockerfile中,它们被声明为ARG所以Railway(和Docker)可以在构建过程中注入它们。API_BASE_INTERNAL也在构建时进行评估(Next.jsrewrites()在...期间运行next build).它被声明为DockerfileARG出于同样的原因。- MCP服务器是一个普通的Node.js/Hono进程,它读取以下位置的所有env变量 运行时无需特殊的构建时间注入。
MCP服务器(mcp-server)
| 变量 | 描述 | 开发默认值 | 生产示例 |
|---|---|---|---|
RTM_API_KEY |
RTM API密钥 | - | abc123... |
RTM_SHARED_SECRET |
RTM共享密钥 | -- | xyz789... |
RTM_CALLBACK_URL |
RTM OAuth回调URL | http://localhost:8787/rtm/callback |
https://api.yourdomain.com/rtm/callback |
RTM_WEBHOOK_SECRET |
webhook HMAC验证随机密钥 | -- | openssl rand -hex 32 |
DATABASE_URL |
PostgreSQL连接字符串 | postgres://rtm:rtm@localhost:5433/rtmdb |
${{Postgres.DATABASE_URL}} |
BETTER_AUTH_SECRET |
身份验证加密密钥 | -- | openssl rand -hex 32 |
BETTER_AUTH_URL |
身份验证基础URL(与 APP_BASE_URL) |
http://localhost:8787 |
https://api.yourdomain.com |
APP_BASE_URL |
服务器的公共URL | http://localhost:8787 |
https://api.yourdomain.com |
WEB_APP_URL |
Web门户URL——由BetterAuth使用 trustedOrigins 以及Hono CORS。 必须与浏览器发送的确切来源相匹配 (方案+域,无尾随斜线)。 |
http://localhost:3000 |
https://yourdomain.com |
PORT |
服务器端口。 铁路会自动设置此项 --不要在铁路中覆盖它。 | 8787 |
(铁路设置) |
NODE_ENV |
环境 | development |
production |
LOG_LEVEL |
记录冗长 | info |
info |
MCP_SERVER_NAME |
MCP协议中的服务器名称 | rtm-mcp-server |
rtm-mcp-server |
MCP_SERVER_VERSION |
服务器版本 | 1.0.0 |
1.0.0 |
MCP_TRANSPORT |
运输方式 | http |
http |
门户网站(web)
来自浏览器的身份验证请求会发送到同一来源(/api/auth/*)并由Next.js通过以下方式代理到MCP服务器 rewrites() 在 next.config.mjs这完全避免了CORS问题。
| 变量 | 描述 | 开发默认值 | 生产示例 |
|---|---|---|---|
NEXT_PUBLIC_API_BASE |
MCP服务器 公共 URL。内联到客户端JS中 构建时间 (Dockerfile ARG).如果满足以下条件,也可用作回退代理目标 API_BASE_INTERNAL 未设置。 |
http://localhost:8787 |
https://api.yourdomain.com |
NEXT_PUBLIC_SITE_URL |
门户网站公共URL(用于元数据) | http://localhost:3000 |
https://yourdomain.com |
API_BASE_INTERNAL |
MCP服务器 内部/私人 Next.js服务器用于代理身份验证请求的URL。评估时间: 构建时间 (Dockerfile ARG).使用容器主机名(Docker)或Railway专用网络URL,使流量保持在内部。 |
本地不需要(回退到 NEXT_PUBLIC_API_BASE) |
http://<service>.railway.internal:<port> |
戈查--
API_BASE_INTERNAL必须使用http://,不https://. 铁路专用网络不使用TLS。端口必须与Railway分配的端口相匹配(检查实际端口的mcp服务部署日志,例如。8080).
PostgreSQL
使用Railway管理的PostgreSQL。在其他服务中引用其变量:
${{Postgres.DATABASE_URL}}
部署步骤
-
创建铁路项目
railway login railway init -
添加PostgreSQL
- 在铁路仪表板中,单击“+新建”→ “数据库”→ “PostgreSQL”
-
添加MCP服务器服务
- 点击“+新建”→ “GitHub回购”→ 选择您的仓库
- 设置根目录:
/ - 铁路自动检测
apps/mcp-server/railway.json - 添加所有MCP服务器环境变量(见上表)
- 不设置
PORT--铁路自动分配 - 设置自定义域(例如。
api.yourdomain.com)
-
添加Web服务
- 点击“+新建”→ “GitHub回购”→ 选择您的仓库
- 设置根目录:
/ - 铁路自动检测
apps/web/railway.json - 添加所有Web门户环境变量(见上表)
- 对于
API_BASE_INTERNAL,使用MCP服务器 专用网络 URL。在mcp服务设置中找到它→ 网络→ 私人。格式为http://<name>.railway.internal:<port>端口是分配给mcp服务的任何Railway(通常检查其部署日志)8080除非被覆盖)。 - 设置自定义域(例如。
yourdomain.com)
-
配置监视模式 在铁路服务设置中,确保启用了“配置为代码”,以便
watchPatterns在railway.json受到尊重。 -
部署
railway up或者推送到GitHub,Railway将自动部署。
域设置
推荐的域结构:
- MCP服务器:
api.yourdomain.com - 门户网站:
yourdomain.com
设置域后,请确保这些变量是一致的:
| 变量 | 必须匹配 |
|---|---|
RTM_CALLBACK_URL |
https://api.yourdomain.com/rtm/callback |
BETTER_AUTH_URL |
https://api.yourdomain.com |
APP_BASE_URL |
https://api.yourdomain.com |
WEB_APP_URL (关于mcp服务) |
https://yourdomain.com (确切的浏览器来源) |
NEXT_PUBLIC_API_BASE (在web服务上) |
https://api.yourdomain.com |
API_BASE_INTERNAL (在web服务上) |
http://<name>.railway.internal:<port> |
故障排除
| 症状 | 可能原因 |
|---|---|
身份验证请求成功 localhost:8787 生产中 |
NEXT_PUBLIC_API_BASE 未设置为 构建时间.重新部署web服务——Railway会自动将服务变量作为Docker构建参数传递,因为Dockerfile声明 ARG NEXT_PUBLIC_API_BASE. |
| 身份验证端点上的CORS错误 | web应用程序正在直接向API发出交叉源请求。Auth应该通过Next.js重写来代理(同源)。检查一下 packages/auth/src/client.ts 没有 baseURL 集。 |
ECONNREFUSED 来自Next.js代理 |
API_BASE_INTERNAL 错了。验证:(1)使用 http:// 不 https://,(2)端口与Railway分配的端口匹配(检查mcp部署日志),(3)mcp服务上启用了专用网络。 |
403 Forbidden /注册/登录时“来源无效” |
WEB_APP_URL mcp服务上的内容与浏览器的来源不匹配。必须是精确的方案+域(例如。 https://yourdomain.com,没有尾随斜线)。 |
502 Bad Gateway 上 api.yourdomain.com |
mcp服务的 PORT env-var与Railway分配的内容冲突。 删除任何 PORT 以(权力)否决 从Railway的mcp服务中,让Railway自动设置。 |
API费率限制
Remember The Milk允许每位用户每秒大约1次请求。这 rtm-client 该包实现了每个用户的自动速率限制,请求之间有1100ms的间隔(使用 瓶颈).
架构决策
时间线管理
RTM需要写操作的“时间线”。根据RTM最佳实践,我们:
- 为每个用户会话创建新的时间线
- 缓存24小时的时间线
- 自动刷新过期的时间线
每用户速率限制
速率限制是针对每个用户(而不是全局)实施的,以确保在多个用户活动时公平访问。每个用户都有自己的请求队列。
Monorepo结构
使用pnpm workspaces+Turbo可以:
- 在MCP服务器和门户网站之间共享代码
- 重用身份验证和数据库包
- 维护RTM客户端的单一信息来源
- 启用快速缓存构建
资源
许可证
麻省理工学院
问题? 打开问题或检查 讨论 选项卡。