@jacob2826/openclaw-dida365-mcp 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # OpenClaw 滴答清单(Dida365)MCP 插件
2
+
3
+ `@jacob2826/openclaw-dida365-mcp` 是一个将 **滴答清单(Dida365)官方 MCP** 直接接入 **OpenClaw Agent 工具层**的插件。
4
+
5
+ 它的目标很明确:在统一的 Agent 会话中调用滴答清单能力,同时保持工具命名、参数结构和上游官方 MCP 一致,不额外引入一层私有 API,也不依赖专用 Agent 路由。
6
+
7
+ ## ✨ 特性
8
+
9
+ - 直接暴露滴答清单(Dida365)官方 MCP 工具
10
+ - 使用官方 `tools/list` 生成的工具 schema
11
+ - 支持随上游工具集更新而刷新
12
+ - 通过 `mcp-remote` 连接远端 MCP,并复用单进程内连接
13
+ - 支持通过 npm 包被 OpenClaw 直接安装
14
+
15
+ ## 兼容性
16
+
17
+ | 插件版本 | OpenClaw 版本 | npm 包名 | 状态 |
18
+ | --- | --- | --- | --- |
19
+ | 0.2.x | `>=2026.3.22` | `@jacob2826/openclaw-dida365-mcp` | 活跃 |
20
+
21
+ ## 🧭 设计定位
22
+
23
+ 这个项目不是滴答清单的替代实现,也不是“再包一层任务 API”的封装器。
24
+ 它更像一个**薄桥接层**:
25
+
26
+ ```text
27
+ OpenClaw Agent
28
+ -> openclaw-dida365-mcp
29
+ -> mcp-remote
30
+ -> https://mcp.dida365.com
31
+ ```
32
+
33
+ 它解决的是这类问题:
34
+
35
+ - 希望在同一个 Agent 会话中直接调用滴答清单(Dida365)能力
36
+ - 希望保持官方工具名,而不是维护一套二次映射
37
+ - 希望插件本身尽量轻,升级路径尽量跟随官方 MCP
38
+
39
+ ## 🆚 与常见接入方式的区别
40
+
41
+ 围绕滴答清单(Dida365)的 Agent 接入,常见做法通常分成几类:
42
+
43
+ | 方式 | 常见特点 | 典型问题 | 本项目的选择 |
44
+ | --- | --- | --- | --- |
45
+ | 专用 Agent 路由 | 把某类会话整体交给一个任务 Agent | 会话入口被拆分,集成边界较重 | 保持在既有 Agent 工具层接入 |
46
+ | 自定义工具映射 | 自定义 `get_today_tasks`、`create_project` 等私有接口 | 工具名和 schema 容易与上游漂移 | 直接使用官方工具名与 schema |
47
+ | 一次性脚本封装 | 用零散脚本拼接查询、创建、更新流程 | 可维护性和可测试性较弱 | 使用标准 OpenClaw 插件结构 |
48
+
49
+ 如果你需要的是“稳定复用上游官方 MCP 能力”,而不是“重新设计一套任务抽象层”,这个项目更合适。
50
+
51
+ ## 📦 MCP 能力概览
52
+
53
+ 截至 `2026-03-24`,重新从滴答清单(Dida365)官方 MCP 拉取 `tools/list` 后,当前官方暴露的工具共 `20` 个;本项目默认按 manifest **全量注册**。
54
+
55
+ 下面的分类仅用于文档说明;运行时仍然直接使用官方工具名。
56
+
57
+ | 抽象分类 | 官方 MCP 工具 | 对应功能 |
58
+ | --- | --- | --- |
59
+ | 项目管理 | `list_projects` | 列出全部项目 |
60
+ | 项目管理 | `get_project_by_id` | 按项目 ID 查看项目详情 |
61
+ | 项目管理 | `get_project_with_undone_tasks` | 查看项目及其未完成任务 |
62
+ | 任务管理 | `create_task` | 创建任务 |
63
+ | 任务管理 | `update_task` | 更新任务内容、时间、字段等信息 |
64
+ | 任务管理 | `get_task_in_project` | 获取某个项目中的指定任务 |
65
+ | 任务管理 | `get_task_by_id` | 按任务 ID 获取任务详情 |
66
+ | 任务管理 | `complete_task` | 标记单个任务完成 |
67
+ | 任务管理 | `complete_tasks_in_project` | 批量完成项目中的任务 |
68
+ | 任务管理 | `move_task` | 移动任务到其他位置或项目 |
69
+ | 查询检索 | `search_task` | 搜索任务 |
70
+ | 查询检索 | `search` | 通用搜索 |
71
+ | 查询检索 | `fetch` | 按 MCP 服务定义执行抓取类查询 |
72
+ | 查询检索 | `filter_tasks` | 按条件筛选任务 |
73
+ | 时间视图 | `list_undone_tasks_by_date` | 按日期查看未完成任务 |
74
+ | 时间视图 | `list_undone_tasks_by_time_query` | 按时间查询词查看未完成任务 |
75
+ | 时间视图 | `list_completed_tasks_by_date` | 按日期查看已完成任务 |
76
+ | 批量操作 | `batch_add_tasks` | 批量创建任务 |
77
+ | 批量操作 | `batch_update_tasks` | 批量更新任务 |
78
+ | 账户配置 | `get_user_preference` | 读取用户偏好设置 |
79
+
80
+ ## 🚀 安装与启用
81
+
82
+ ### 1. 通过 OpenClaw 直接安装
83
+
84
+ ```bash
85
+ openclaw plugins install "@jacob2826/openclaw-dida365-mcp"
86
+ ```
87
+
88
+ 如果你需要安装指定版本:
89
+
90
+ ```bash
91
+ openclaw plugins install "@jacob2826/openclaw-dida365-mcp@0.2.2"
92
+ ```
93
+
94
+ ### 2. 启用插件
95
+
96
+ ```bash
97
+ openclaw config set plugins.entries.openclaw-dida365-mcp.enabled true
98
+ ```
99
+
100
+ ### 3. 将插件开放给目标 Agent
101
+
102
+ 如果你的 Agent 使用了工具 allowlist,请确保把插件 `id` 加进去。下面的片段只是示意,请在你现有配置基础上合并:
103
+
104
+ ```json
105
+ {
106
+ "agents": {
107
+ "main": {
108
+ "tools": {
109
+ "allow": ["openclaw-dida365-mcp"]
110
+ }
111
+ }
112
+ }
113
+ }
114
+ ```
115
+
116
+ ### 4. 重启 gateway
117
+
118
+ ```bash
119
+ openclaw gateway restart
120
+ ```
121
+
122
+ ### 5. 完成 OAuth
123
+
124
+ 首次真实调用工具时,`mcp-remote` 会触发浏览器登录。完成一次授权后,后续通常会复用本地 token。
125
+
126
+ ## ⚙️ 配置项
127
+
128
+ | 配置项 | 默认值 | 说明 |
129
+ | --- | --- | --- |
130
+ | `serverUrl` | `https://mcp.dida365.com` | 滴答清单(Dida365)MCP 地址 |
131
+ | `command` | `npx` | 启动 `mcp-remote` 的命令 |
132
+ | `args` | `["-y", "mcp-remote@latest"]` | 启动参数 |
133
+ | `host` | `127.0.0.1` | 本地 OAuth 回调监听地址 |
134
+ | `authTimeoutSeconds` | `300` | OAuth 等待时间 |
135
+ | `requestTimeoutSeconds` | `300` | MCP 请求超时 |
136
+ | `idleTimeoutSeconds` | `600` | 空闲多久后自动关闭内部子进程 |
137
+ | `refreshManifestOnStartup` | `false` | 启动时是否自动刷新 manifest |
138
+ | `manifestPath` | `data/mcp-tools.json` | 自定义 manifest 路径 |
139
+ | `toolAllowlist` | `[]` | 仅注册指定工具 |
140
+ | `toolDenylist` | `[]` | 排除指定工具 |
141
+
142
+ ## 🔁 连接模型
143
+
144
+ 该插件不会额外引入一个长期常驻服务。
145
+
146
+ 当前行为是:
147
+
148
+ - 第一次调用滴答清单(Dida365)工具时拉起 `mcp-remote`
149
+ - 同一个 OpenClaw 进程内复用同一条连接
150
+ - 默认空闲 `600` 秒自动关闭
151
+ - 下次调用时自动重连
152
+
153
+ 这样做的目的是在“调用延迟”和“进程常驻成本”之间取得平衡。
154
+
155
+ 需要注意的是:
156
+
157
+ - 单进程内连接复用是有保证的
158
+ - 如果你另外启动独立调试进程,它们仍会建立各自的连接
159
+
160
+ ## 🧪 开发与验证
161
+
162
+ ```bash
163
+ npm install
164
+ npm run build
165
+ npm run check
166
+ npm test
167
+ npm run refresh-tools
168
+ npm run verify-basic
169
+ ```
170
+
171
+ 其中:
172
+
173
+ - `npm test`:覆盖配置解析、manifest 处理、连接复用、空闲回收、注册逻辑等
174
+ - `npm run refresh-tools`:重新从官方 MCP 拉取 `tools/list`
175
+ - `npm run verify-basic`:做一轮真实基础联通验证,当前覆盖
176
+ - `list_projects`
177
+ - `list_undone_tasks_by_time_query`
178
+ - `create_task`
179
+ - `complete_task`
180
+
181
+ CI 不执行真实 OAuth 集成测试;需要登录和真实账号数据的验证,仍建议在本地完成。
182
+
183
+ ## 🛡️ 安全边界
184
+
185
+ 当前版本默认具备这些约束:
186
+
187
+ - 远程 MCP 只允许 `https://`
188
+ - `http://` 仅允许本机回环地址
189
+ - 会对 `mcp-remote` stderr 中常见 token 字段做脱敏
190
+ - 默认不在插件启动时自动联网刷新 manifest
191
+ - 如果 manifest 对应的 `serverUrl` 与当前配置不一致,会给出告警
192
+
193
+ 更完整的说明见 [SECURITY.md](./SECURITY.md)。
194
+
195
+ ## 📝 已知限制
196
+
197
+ - 本项目透传的是官方 MCP,因此工具集合最终取决于官方 `tools/list`
198
+ - CI 不做线上 OAuth 测试
199
+ - 连接复用保证仅限单个 OpenClaw 进程
200
+
201
+ ## 📄 License
202
+
203
+ 以仓库根目录实际的 `LICENSE` 文件为准。
package/SECURITY.md ADDED
@@ -0,0 +1,58 @@
1
+ # 安全说明
2
+
3
+ 这个项目会在本地 OpenClaw 进程中拉起 `mcp-remote`,并通过 OAuth 访问 `https://mcp.dida365.com`。虽然它不主动保存账号密码,但仍然涉及 token、任务内容和日志输出,因此需要明确安全边界。
4
+
5
+ ## 安全边界
6
+
7
+ 当前版本默认具备这些约束:
8
+
9
+ - 远程 `serverUrl` 只允许 `https://`
10
+ - `http://` 仅允许 `localhost`、`127.0.0.1`、`::1` 这样的本机回环地址
11
+ - 会对 `mcp-remote` stderr 中常见的 `access_token`、`refresh_token`、`id_token` 字段做脱敏
12
+ - 默认不在插件启动时自动刷新 manifest,避免无意中触发联网和登录
13
+ - 同一个 OpenClaw 进程内只复用一条桥接连接,减少无意义的重复进程和日志面
14
+
15
+ ## 你需要知道的事实
16
+
17
+ - OAuth token 由 `mcp-remote` 维护,不存放在这个仓库里
18
+ - 本项目不会把 token 写入 `data/mcp-tools.json`
19
+ - `npm run verify-basic` 会真实创建并完成一条测试任务,请不要在生产数据环境里随意执行
20
+ - 如果你另外启动了独立的调试进程,它们会各自建立自己的 `mcp-remote` 连接
21
+
22
+ ## 不要这样做
23
+
24
+ - 不要把 `~/.mcp-auth` 目录提交到 Git
25
+ - 不要在公开 Issue 或 PR 评论里粘贴 OAuth 回调地址、token、完整调试日志
26
+ - 不要把 `serverUrl` 改成非 HTTPS 的公网地址
27
+ - 不要让 CI 跑需要真实 OAuth 的测试
28
+
29
+ ## 漏洞报告
30
+
31
+ 如果你发现的问题可能导致以下风险,请不要直接公开披露:
32
+
33
+ - token 泄漏
34
+ - 任意命令执行
35
+ - 未授权的数据读取或写入
36
+ - 日志中泄漏敏感数据
37
+
38
+ 建议优先使用:
39
+
40
+ - GitHub 私密安全通道(如果仓库已启用)
41
+ - 或直接私下联系维护者
42
+
43
+ 在私下报告中,建议包含:
44
+
45
+ - 影响版本
46
+ - 复现步骤
47
+ - 影响范围
48
+ - 是否需要真实账号才能复现
49
+ - 建议的缓解方式
50
+
51
+ ## 当前支持的修复范围
52
+
53
+ 原则上优先修复:
54
+
55
+ - 最新发布版本
56
+ - `main` 分支上的当前开发版本
57
+
58
+ 如果问题只存在于明显过时且已不再维护的分支,可能不会单独回补。