任务管理集成服务

一个连接AI助手与Remember The Milk任务的MCP服务器,支持通过自然语言管理任务。

  • by allen-n
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 allen-n/rtm-mcp

使用说明

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帐户

  1. 访问 http://localhost:3000 (门户网站)
  2. 使用电子邮件/密码创建帐户
  3. 点击“Connect RTM”链接您的Remember The Milk帐户
  4. 在RTM上授权应用程序
  5. 连接后,您将看到一条成功消息!

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.js rewrites() 在...期间运行 next build).它被声明为Dockerfile ARG 出于同样的原因。
  • 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}}

部署步骤

  1. 创建铁路项目

    railway login
    railway init
    
  2. 添加PostgreSQL

    • 在铁路仪表板中,单击“+新建”→ “数据库”→ “PostgreSQL”
  3. 添加MCP服务器服务

    • 点击“+新建”→ “GitHub回购”→ 选择您的仓库
    • 设置根目录: /
    • 铁路自动检测 apps/mcp-server/railway.json
    • 添加所有MCP服务器环境变量(见上表)
    • 不设置 PORT --铁路自动分配
    • 设置自定义域(例如。 api.yourdomain.com)
  4. 添加Web服务

    • 点击“+新建”→ “GitHub回购”→ 选择您的仓库
    • 设置根目录: /
    • 铁路自动检测 apps/web/railway.json
    • 添加所有Web门户环境变量(见上表)
    • 对于 API_BASE_INTERNAL,使用MCP服务器 专用网络 URL。在mcp服务设置中找到它→ 网络→ 私人。格式为 http://<name>.railway.internal:<port>端口是分配给mcp服务的任何Railway(通常检查其部署日志) 8080 除非被覆盖)。
    • 设置自定义域(例如。 yourdomain.com)
  5. 配置监视模式 在铁路服务设置中,确保启用了“配置为代码”,以便 watchPatterns 在 railway.json 受到尊重。

  6. 部署

    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客户端的单一信息来源
  • 启用快速缓存构建

资源

许可证

麻省理工学院


问题? 打开问题或检查 讨论 选项卡。