Skip to main content
Glama
README.md
# Task MCP - 滴答清单 MCP 服务器

<p align="center">
  <img src="https://img.shields.io/badge/MCP-1.0.0-blue?style=flat-square" alt="MCP Version">
  <img src="https://img.shields.io/badge/TypeScript-5.0-blue?style=flat-square&logo=typescript" alt="TypeScript">
  <img src="https://img.shields.io/badge/Node.js-20+-green?style=flat-square&logo=node.js" alt="Node.js">
  <img src="https://img.shields.io/badge/License-MIT-yellow?style=flat-square" alt="License">
</p>

一个基于 **Model Context Protocol (MCP)** 的 TypeScript 项目,用于与 **滴答清单 (Dida365)** 进行 API 集成,允许 AI 助手(如 Claude、Gemini 等)通过 MCP 协议管理用户的滴答清单任务。

## ✨ 功能特性

- 🔄 **完整的任务管理**: 支持获取、创建、更新、删除、完成任务
- 📅 **智能日期筛选**: 支持今天、昨天、最近7天等多种筛选模式
- 🏷️ **项目管理**: 自动匹配项目名称,支持模糊匹配
- 🕐 **时区处理**: 自动处理 UTC 与北京时间的转换
- ✅ **参数验证**: 使用 Zod 进行严格的输入校验

## 📁 项目结构

```
task-mcp/
├── .env                    # 环境变量配置
├── .env.example            # 环境变量示例
├── package.json            # 项目配置
├── tsconfig.json           # TypeScript 配置
├── didaAPI.md              # 滴答清单 OpenAPI 完整文档
└── src/
    ├── index.ts            # 主入口:MCP 服务器 + HTTP 端点
    ├── api/
    │   └── dida.ts         # 滴答清单 API 客户端封装
    ├── tools/
    │   └── task.ts         # 任务工具实现(核心业务逻辑)
    ├── types/
    │   └── index.ts        # TypeScript 类型定义
    └── utils/
        └── date.ts         # 日期工具(UTC ↔ 北京时间转换)
```

## 🚀 快速开始

### 1. 安装依赖

```bash
yarn install
# 或
npm install
```

### 2. 配置环境变量

复制 `.env.example` 为 `.env` 并填写配置:

```bash
cp .env.example .env
```

编辑 `.env` 文件:

```env
# 滴答清单 API 访问令牌
DIDA_ACCESS_TOKEN=your_access_token_here

# 服务端口(可选,默认 3000)
PORT=3010
```

> 💡 **获取 Access Token**: 访问 [滴答清单开发者中心](https://developer.dida365.com/manage) 注册应用并完成 OAuth 授权流程。

### 3. 启动服务

```bash
# 开发模式(热重载)
yarn dev

# 生产模式
yarn start
```

服务启动后,MCP 端点为:`http://localhost:3010/mcp`

## 🔧 MCP 工具

本项目提供以下 5 个 MCP 工具:

### `get_tasks` - 获取任务列表

获取任务列表,支持多种筛选条件。

| 参数 | 类型 | 必需 | 说明 |
|------|------|------|------|
| `mode` | string | 否 | 筛选模式:`all`(默认)、`today`、`yesterday`、`recent_7_days` |
| `keyword` | string | 否 | 关键词,匹配任务标题或内容 |
| `priority` | number | 否 | 优先级:`0`-无、`1`-低、`3`-中、`5`-高 |
| `project_name` | string | 否 | 项目名称筛选 |
| `completed` | boolean | 否 | 完成状态:`true`-已完成、`false`-未完成 |

### `create_task` - 创建任务

创建新任务。

| 参数 | 类型 | 必需 | 说明 |
|------|------|------|------|
| `title` | string | ✅ | 任务标题 |
| `content` | string | 否 | 任务内容/描述 |
| `priority` | number | 否 | 优先级:`0`-无、`1`-低、`3`-中、`5`-高 |
| `project_name` | string | 否 | 项目名称 |
| `start_date` | string | 否 | 开始日期,格式:`YYYY-MM-DD` 或 `YYYY-MM-DD HH:MM:SS` |
| `due_date` | string | 否 | 截止日期,格式同上 |
| `is_all_day` | boolean | 否 | 是否全天任务 |
| `reminder` | string | 否 | 提醒选项:`"0"`(准时)、`"-5M"`(提前5分钟)、`"-1H"`(提前1小时)、`"-1D"`(提前1天) |

### `update_task` - 更新任务

更新现有任务的属性。

| 参数 | 类型 | 必需 | 说明 |
|------|------|------|------|
| `task_id` | string | ✅ | 任务 ID 或任务标题 |
| `title` | string | 否 | 新任务标题 |
| `content` | string | 否 | 新任务内容 |
| `priority` | number | 否 | 新优先级 |
| `project_name` | string | 否 | 新项目名称 |
| `start_date` | string | 否 | 新开始日期 |
| `due_date` | string | 否 | 新截止日期 |
| `status` | number | 否 | 新状态:`0`-未完成、`2`-已完成 |

> ⚠️ **注意**: 将 `status` 设置为 `2` 会调用完成任务接口。取消完成(`status=0`)不受官方 API 支持。

### `delete_task` - 删除任务

删除指定任务。

| 参数 | 类型 | 必需 | 说明 |
|------|------|------|------|
| `task_id` | string | ✅ | 任务 ID 或任务标题 |

### `complete_task` - 完成任务

将任务标记为已完成。

| 参数 | 类型 | 必需 | 说明 |
|------|------|------|------|
| `task_id` | string | ✅ | 任务 ID 或任务标题 |

## 🌐 技术架构

```
┌─────────────────┐     HTTP/MCP      ┌─────────────────┐     HTTPS     ┌─────────────────┐
│   AI 助手       │ ◄──────────────► │   Task MCP      │ ◄───────────► │  滴答清单 API   │
│ (Claude/Gemini) │                   │   (本服务)       │               │  api.dida365.com│
└─────────────────┘                   └─────────────────┘               └─────────────────┘
```

- **传输协议**: StreamableHTTPServerTransport
- **HTTP 端点**: `/mcp`(MCP 通信)、`/health`(健康检查)
- **API 客户端**: 基于 Fetch API 封装滴答清单 OpenAPI
- **时区处理**: 自动处理 UTC ↔ 北京时间 (Asia/Shanghai) 转换

## 📝 使用示例

### 在 MCP 客户端中配置

```json
{
  "mcpServers": {
    "task-mcp": {
      "url": "http://localhost:3010/mcp"
    }
  }
}
```

### 示例对话

```
用户:帮我查看今天的任务

AI:调用 get_tasks 工具,参数 mode="today"

用户:创建一个任务"完成项目报告",高优先级,截止日期是明天

AI:调用 create_task 工具,参数 title="完成项目报告", priority=5, due_date="2026-01-30"

用户:把"完成项目报告"标记为完成

AI:调用 complete_task 工具,参数 task_id="完成项目报告"
```

## 🔑 优先级对照表

| 值 | 含义 | 滴答清单显示 |
|----|------|-------------|
| `0` | 无优先级 | 无标记 |
| `1` | 低优先级 | 🔵 蓝色 |
| `3` | 中优先级 | 🟡 黄色 |
| `5` | 高优先级 | 🔴 红色 |

## 📚 相关文档

- [滴答清单开发者中心](https://developer.dida365.com/manage)
- [MCP 官方文档](https://modelcontextprotocol.io/)
- 项目内置 API 文档:[didaAPI.md](./didaAPI.md)

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📄 许可证

MIT License