提醒MCP服务器
MCP(模型上下文协议)服务器,为AI助手提供可靠的提醒、持久内存、任务跟踪和活动历史。专为 戳 (iMessage AI机器人),与任何MCP客户端兼容。
描述
Poke是一款出色的人工智能助手,但其内置的提醒、任务和记忆功能存在可靠性问题。我没有等待修复,而是在以下工具的帮助下构建了这个MCP服务器 克劳德代码 我自己来处理这些能力。结果是一个自托管的堆栈,使Poke(以及任何兼容MCP的客户端)变得更加有用。
该服务器通过Streamable HTTP公开了20个MCP工具,并由一个多用户web仪表板支持,用于通过浏览器管理所有内容。它支持SQLite进行简单设置,支持PostgreSQL进行生产,并具有可选的Authentik SSO集成。
特性
- 预定提醒 --具有自然语言解析的基于时间的通知(“明天下午2点”,“30分钟后”)。当提醒触发时,Webhook会推送通知。
- 持久内存 --按需存储和召回信息。基于标签的组织,具有全文搜索和可选语义搜索(OpenAI嵌入+Redis)。支持作用域内存(个人、团队、应用程序、全局),具有写时数据消除和会话摘要链的显式替换功能。聊天范围的内存允许将内存与对话线程相关联,以实现上下文隔离(接受任何字符串ID格式——UUID、CUID等)。
- 任务跟踪 --具有可配置签入间隔(默认5分钟)的长时间运行任务。定期发送webhook通知,直至完成。
- 活动历史记录 --所有事件的完整审计日志。按时间范围、类型和操作进行查询,并提供日/周/月摘要。
- Web仪表板 --React前端具有统计卡、30天活动图表(Recharts)、提醒日历视图和可搜索内存列表。
- 团队与应用 --创建团队,添加成员,并在团队成员之间分享回忆。应用程序可以根据每个代理的知识划分给团队。
- 多用户 -通过范围共享进行用户数据隔离。MCP客户端通过API密钥(用户或团队范围)进行身份验证,web前端使用JWT Cookie。第一个用户被自动提升为管理员。
- SSO集成 --可选的Authentik通过Traefik转发身份验证。用户在首次SSO登录时自动创建。
- API密钥管理 -从web UI创建和撤销API密钥。密钥是SHA-256散列的(从不以明文存储)。
- 管理面板 --使用管理员角色切换进行用户管理。完整数据库备份(
.json.gz下载)并恢复。 - 深色模式 --通过手动亮/暗/系统切换进行系统偏好检测。
- 双数据库支持 --SQLite用于开发和简单部署,PostgreSQL用于生产。
- Webhook通知 --当提醒触发或任务需要签到时,向Poke(或任何端点)推送通知。支持通过MCP工具为程序化消费者进行动态webhook注册(连续失败后自动注销)。
为什么这个项目有用
- Poke的内置功能不可靠 --提醒并不总是会触发,记忆不一致,任务跟踪有限。此服务器用一个强大的自托管替代方案取代了所有这些。
- 适用于任何MCP客户端 --没有被锁在口袋里。可与Claude Desktop、任何MCP兼容工具或附带的web仪表板配合使用。
- 您拥有自己的数据 --具有完整备份/还原功能的自托管。没有供应商锁定,没有第三方数据存储。
- 多用户就绪 --通过数据隔离、SSO和管理控件支持多个用户。为自己运行或与他人分享。
- 生产级 --PostgreSQL、Docker、健康检查、Traefik集成和Authentik SSO。这不是玩具,正在生产中。
MCP工具(20)
| 工具 | 说明 |
|---|---|
create_reminder | 安排提醒(支持自然语言时间) |
list_reminders | 列出待处理或所有提醒 |
complete_reminder | 将提醒标记为已完成 |
cancel_reminder | 取消待处理的提醒 |
remember | 存储具有可选作用域、分类、标签、chat_id和替代项的内存 |
recall | 使用搜索/标签/范围/聊天_id过滤器跨范围检索内存 |
forget | 删除内存(基于范围的权限检查) |
promote_memory | 将内存复制到不同的范围(例如,个人到团队) |
list_scopes | 列出可用内存范围(个人、团队、应用程序、全局) |
start_task | 开始跟踪长时间运行的任务 |
check_task | 获取特定任务的状态 |
list_tasks | 列出带有可选状态筛选器的任务 |
complete_task | 将任务标记为已完成 |
update_task | 更新任务状态或添加注释 |
register_webhook | 注册URL以接收推送通知(带有可选的API密钥和事件过滤器) |
unregister_webhook | 删除已注册的webhook URL |
list_webhooks | 列出此用户的所有已注册Webhook |
get_pending_checkups | 获取所有需要登记的到期提醒和任务 |
get_activity | 按时间范围查询活动历史 |
get_summary | 获取最近活动的摘要 |
入门指南
选项1:独立使用SQLite
最简单的设置——不需要外部数据库。
# Clone and build
git clone https://github.com/sj7trunks/reminder-mcp.git
cd reminder-mcp
npm install
npm run build
# Generate secrets
export API_KEY=$(openssl rand -hex 32)
export SECRET_KEY=$(openssl rand -hex 32)
# Run in HTTP mode
API_KEY=$API_KEY SECRET_KEY=$SECRET_KEY npm run start:http
# Verify
curl http://localhost:3000/healthSQLite数据库在以下位置自动创建 ./data/reminder.db.
对于本地使用Claude Desktop(stdio模式),请添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"reminder": {
"command": "node",
"args": ["/path/to/reminder-mcp/dist/index.js"],
"env": {
"DATABASE_PATH": "/path/to/reminder-mcp/data/reminder.db",
"DEFAULT_TIMEZONE": "America/Los_Angeles"
}
}
}
}选项2:使用PostgreSQL和Docker进行生产
# Generate secrets
export API_KEY=$(openssl rand -hex 32)
export SECRET_KEY=$(openssl rand -hex 32)
export PG_PASSWORD=$(openssl rand -hex 16)
echo "Save these values:"
echo " API_KEY=$API_KEY"
echo " SECRET_KEY=$SECRET_KEY"
echo " PG_PASSWORD=$PG_PASSWORD"添加到您的 docker-compose.yml:
services:
reminder-mcp-postgres:
image: postgres:16-alpine
container_name: reminder-mcp-postgres
restart: unless-stopped
environment:
- POSTGRES_USER=reminder
- POSTGRES_PASSWORD=${PG_PASSWORD}
- POSTGRES_DB=reminder_mcp
volumes:
- reminder-mcp-pg-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U reminder -d reminder_mcp"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
reminder-mcp:
build:
context: ./reminder-mcp
dockerfile: Dockerfile
container_name: reminder-mcp
restart: unless-stopped
environment:
- NODE_ENV=production
- PORT=3000
- HOST=0.0.0.0
- API_KEY=${API_KEY}
- SECRET_KEY=${SECRET_KEY}
- DATABASE_TYPE=postgres
- DATABASE_URL=postgresql://reminder:${PG_PASSWORD}@reminder-mcp-postgres:5432/reminder_mcp
- DEFAULT_TIMEZONE=America/Los_Angeles
# Optional: Push notifications
# - WEBHOOK_URL=https://poke.com/api/v1/inbound-sms/webhook
# - WEBHOOK_API_KEY=your-poke-api-key
# Optional: Authentik SSO
# - AUTHENTIK_HOST=https://your-authentik-domain.com
depends_on:
reminder-mcp-postgres:
condition: service_healthy
ports:
- "3000:3000"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000/health"]
interval: 30s
timeout: 3s
retries: 3
start_period: 10s
volumes:
reminder-mcp-pg-data:
driver: localdocker compose up -d
curl http://localhost:3000/health配置Poke
- 打开Poke>设置>集成>新集成
- 填写:
- 名字: Reminders - 服务器URL: https://your-domain.com/mcp - API密钥:您生成的API密钥
- 创建集成
对于推送通知(因此在提醒触发时向您发送Poke消息):
- 前往扑克>设置>高级并生成一个webhook API密钥
- 集
WEBHOOK_URL和WEBHOOK_API_KEY在您的环境中
重要:Poke需要SSE(服务器发送事件)格式。配置您的MCP客户端以接受 text/event-stream 除了 application/json.
可选:语义搜索
使用OpenAI嵌入和Redis启用基于AI的语义搜索记忆:
# Set environment variables
export OPENAI_API_KEY=sk-...
export REDIS_URL=redis://localhost:6379
# Or add to docker-compose.yml
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- REDIS_URL=redis://redis:6379语义搜索使用 text-embedding-3-small (1536维)存储在Redis中,具有向量相似性搜索功能。当创建或更新内存时,嵌入会在后台自动生成。
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
API_KEY | 是(HTTP) | - | 种子API密钥(首次运行时哈希) |
SECRET_KEY | 是 | - | JWT签名秘密 |
PORT | 没有 | 3000 | HTTP服务器端口 |
HOST | 没有 | 0.0.0.0 | HTTP服务器绑定地址 |
DATABASE_TYPE | 没有 | sqlite | sqlite 或 postgres |
DATABASE_PATH | 没有 | ./data/reminder.db | SQLite文件路径 |
DATABASE_URL | 无 | - | PostgreSQL连接字符串 |
DEFAULT_TIMEZONE | 没有 | America/Los_Angeles | 默认时区 |
WEBHOOK_URL | 否 | - | 推送通知端点 |
WEBHOOK_API_KEY | 没有 | - | webhook的承载令牌 |
AUTHENTIK_HOST | 没有 | - | SSO的身份验证基URL |
OPENAI_API_KEY | 没有用于语义搜索的 | - | OpenAI API键 |
REDIS_URL | 没有用于矢量存储(语义搜索)的Redis URL | ||
LOG_LEVEL | 没有 | info | debug, info, warn, error |
项目结构
reminder-mcp/
├── src/
│ ├── index.ts # stdio transport entry point
│ ├── http.ts # HTTP transport entry point (Express app)
│ ├── server.ts # MCP server & tool registration
│ ├── config/
│ │ └── index.ts # Zod-validated environment config
│ ├── types/
│ │ └── context.ts # McpContext interface for scope/auth
│ ├── db/
│ │ ├── index.ts # Knex connection (SQLite/PostgreSQL)
│ │ ├── migrations/ # Database migrations (001-013)
│ │ └── models/ # Zod schemas (User, ApiKey, Team, Memory, etc.)
│ ├── middleware/
│ │ └── auth.ts # JWT, API key, Authentik SSO middleware
│ ├── routes/
│ │ ├── auth.ts # Register, login, logout, session
│ │ ├── keys.ts # API key management
│ │ ├── reminders.ts # Reminder CRUD
│ │ ├── memories.ts # Memory CRUD with search + scope filtering
│ │ ├── tasks.ts # Task CRUD
│ │ ├── stats.ts # Dashboard statistics
│ │ ├── admin.ts # User management, backup/restore
│ │ ├── teams.ts # Team CRUD + member management
│ │ └── applications.ts # Application CRUD
│ ├── services/
│ │ ├── scheduler.ts # Background job scheduler (60s poll)
│ │ ├── notifier.ts # Webhook notifications (Poke format)
│ │ ├── timezone.ts # Timezone conversion & parsing
│ │ ├── embedding.ts # OpenAI embeddings (text-embedding-3-small)
│ │ └── embedding-worker.ts # Background worker for generating embeddings
│ ├── tools/
│ │ ├── reminders.ts # Reminder MCP tools
│ │ ├── memory.ts # Memory MCP tools
│ │ ├── tasks.ts # Task MCP tools
│ │ └── history.ts # Activity query tools
│ └── resources/
│ └── status.ts # Server status resource
├── frontend/
│ ├── src/
│ │ ├── main.tsx # React entry point
│ │ ├── App.tsx # Router with auth guards
│ │ ├── api/client.ts # API client (fetch + credentials)
│ │ ├── components/
│ │ │ └── Layout.tsx # App shell with nav & theme toggle
│ │ ├── contexts/
│ │ │ └── ThemeContext.tsx # Dark/light/system theme
│ │ └── pages/
│ │ ├── Login.tsx # Login form + SSO button
│ │ ├── Register.tsx # Registration form
│ │ ├── Dashboard.tsx # Stats + activity chart
│ │ ├── Reminders.tsx # Calendar view
│ │ ├── Memories.tsx # Searchable memory list with scope filter
│ │ ├── Teams.tsx # Team management + members
│ │ ├── Settings.tsx # API keys (user/team) + theme
│ │ └── Admin.tsx # User mgmt + backup/restore
│ ├── vite.config.ts # Vite config with dev proxy
│ └── tailwind.config.js # Tailwind CSS config
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Standalone Docker setup
├── .env.example # Environment variable template
├── CLAUDE.md # Development guide for AI assistants
└── LICENSE # MIT License技术栈
- 运行时:Node.js 20+TypeScript(ESM)
- 主控程序:
@modelcontextprotocol/sdk(流式HTTP传输) - 后端:Express 5、Knex.js、Zod
- 前端:React 18、Vite、顺风CSS、React Query、Recharts
- 数据库:SQLite(better-splite3)或PostgreSQL
- 认证:JWT(jsonwebtoken)、bcrypt、SHA-256 API密钥哈希
- 单点登录:Authentik通过Traefik转发身份验证
获取帮助
如果您遇到问题或有疑问:
学分
许可证
麻省理工学院——见 许可证.
安全通知
该项目是作为个人工具构建的,没有经过正式的安全审计。如果在生产环境中部署此功能:
- 为以下对象生成强大、独特的价值
API_KEY和SECRET_KEY(openssl rand -hex 32) - 对所有流量使用HTTPS(TLS)-永远不要通过纯HTTP公开API
- 查看身份验证中间件(
src/middleware/auth.ts)针对您的威胁模型 - 保持依赖关系更新(
npm audit) - 除了应用程序级身份验证外,还要考虑网络级访问控制(防火墙规则、VPN)
- 管理员备份/还原端点可以导出和覆盖所有数据——谨慎限制管理员访问
