dingtalk-mcp 1.1.2 → 1.1.4
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 +14 -11
- package/dingtalk_calendar_mcp_server.yaml +241 -601
- package/dingtalk_tb_mcp_server.yaml +360 -0
- package/dist/DingTalkMCPServer.js +11 -4
- package/package.json +7 -6
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
server:
|
|
2
|
+
name: dingtalk-teambition
|
|
3
|
+
description: 钉钉Teambition-项目管理
|
|
4
|
+
tools:
|
|
5
|
+
|
|
6
|
+
- name: createProject
|
|
7
|
+
description: 创建项目
|
|
8
|
+
requestTemplate:
|
|
9
|
+
method: POST
|
|
10
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projects
|
|
11
|
+
args:
|
|
12
|
+
- name: userId
|
|
13
|
+
description: 操作者userId。
|
|
14
|
+
type: string
|
|
15
|
+
required: true
|
|
16
|
+
position: path
|
|
17
|
+
- name: name
|
|
18
|
+
description: 项目名称。
|
|
19
|
+
type: string
|
|
20
|
+
required: true
|
|
21
|
+
position: body
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
- name: queryProjectsByProjectName
|
|
25
|
+
description: 根据项目名称模糊查询项目信息
|
|
26
|
+
requestTemplate:
|
|
27
|
+
method: POST
|
|
28
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projects/query
|
|
29
|
+
args:
|
|
30
|
+
- name: userId
|
|
31
|
+
description: 操作者userId。
|
|
32
|
+
type: string
|
|
33
|
+
required: true
|
|
34
|
+
position: path
|
|
35
|
+
- name: name
|
|
36
|
+
description: 项目名称,模糊查询指定项目名称的项目信息
|
|
37
|
+
type: string
|
|
38
|
+
required: true
|
|
39
|
+
position: body
|
|
40
|
+
- name: maxResults
|
|
41
|
+
description: 分页大小,默认10,最大300
|
|
42
|
+
type: number
|
|
43
|
+
required: false
|
|
44
|
+
position: body
|
|
45
|
+
- name: nextToken
|
|
46
|
+
description: 分页标。供分页使用,下一页token,从当前查询结果中获取。
|
|
47
|
+
type: string
|
|
48
|
+
required: false
|
|
49
|
+
position: body
|
|
50
|
+
|
|
51
|
+
- name: queryProjectStatusesByProjectId
|
|
52
|
+
description: 根据项目ID查询项目状态信息
|
|
53
|
+
requestTemplate:
|
|
54
|
+
method: GET
|
|
55
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projects/{projectId}/statuses
|
|
56
|
+
args:
|
|
57
|
+
- name: userId
|
|
58
|
+
description: 操作者userId。
|
|
59
|
+
type: string
|
|
60
|
+
required: true
|
|
61
|
+
position: path
|
|
62
|
+
- name: projectId
|
|
63
|
+
description: 项目ID。
|
|
64
|
+
type: string
|
|
65
|
+
required: true
|
|
66
|
+
position: path
|
|
67
|
+
|
|
68
|
+
- name: queryProjectMembersByProjectId
|
|
69
|
+
description: 根据项目ID查询项目成员信息
|
|
70
|
+
requestTemplate:
|
|
71
|
+
method: GET
|
|
72
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projects/{projectId}/members?maxResults={String}
|
|
73
|
+
args:
|
|
74
|
+
- name: userId
|
|
75
|
+
description: 操作者userId。
|
|
76
|
+
type: string
|
|
77
|
+
required: true
|
|
78
|
+
position: path
|
|
79
|
+
- name: projectId
|
|
80
|
+
description: 项目ID。
|
|
81
|
+
type: string
|
|
82
|
+
required: true
|
|
83
|
+
position: path
|
|
84
|
+
- name: maxResults
|
|
85
|
+
description: 分页大小,默认10,最大300
|
|
86
|
+
type: number
|
|
87
|
+
required: false
|
|
88
|
+
position: query
|
|
89
|
+
|
|
90
|
+
- name: addProjectMembers
|
|
91
|
+
description: 添加项目成员
|
|
92
|
+
requestTemplate:
|
|
93
|
+
method: POST
|
|
94
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projects/{projectId}/members
|
|
95
|
+
args:
|
|
96
|
+
- name: userId
|
|
97
|
+
description: 操作者userId。
|
|
98
|
+
type: string
|
|
99
|
+
required: true
|
|
100
|
+
position: path
|
|
101
|
+
- name: projectId
|
|
102
|
+
description: 项目ID。
|
|
103
|
+
type: string
|
|
104
|
+
required: true
|
|
105
|
+
position: path
|
|
106
|
+
- name: userIds
|
|
107
|
+
description: 被添加的用户userId列表,建议一次不超过10个。
|
|
108
|
+
type: array
|
|
109
|
+
required: true
|
|
110
|
+
position: body
|
|
111
|
+
items:
|
|
112
|
+
type: string
|
|
113
|
+
|
|
114
|
+
- name: removeProjectMembers
|
|
115
|
+
description: 添加项目成员
|
|
116
|
+
requestTemplate:
|
|
117
|
+
method: POST
|
|
118
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projects/{projectId}/members/remove
|
|
119
|
+
args:
|
|
120
|
+
- name: userId
|
|
121
|
+
description: 操作者userId。
|
|
122
|
+
type: string
|
|
123
|
+
required: true
|
|
124
|
+
position: path
|
|
125
|
+
- name: projectId
|
|
126
|
+
description: 项目ID。
|
|
127
|
+
type: string
|
|
128
|
+
required: true
|
|
129
|
+
position: path
|
|
130
|
+
- name: userIds
|
|
131
|
+
description: 被删除的用户userId列表,建议一次不超过10个。
|
|
132
|
+
type: array
|
|
133
|
+
required: true
|
|
134
|
+
position: body
|
|
135
|
+
items:
|
|
136
|
+
type: string
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
# 项目任务
|
|
140
|
+
- name: listProjectTasks
|
|
141
|
+
description: 查询项目中的任务列表
|
|
142
|
+
requestTemplate:
|
|
143
|
+
method: GET
|
|
144
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/projectIds/{projectId}/tasks?nextToken=String&maxResults=Integer
|
|
145
|
+
args:
|
|
146
|
+
- name: userId
|
|
147
|
+
description: 操作者userId。
|
|
148
|
+
type: string
|
|
149
|
+
required: true
|
|
150
|
+
position: path
|
|
151
|
+
- name: projectId
|
|
152
|
+
description: 项目ID。
|
|
153
|
+
type: string
|
|
154
|
+
required: true
|
|
155
|
+
position: path
|
|
156
|
+
- name: nextToken
|
|
157
|
+
description: 分页游标。如果是首次调用,该参数不传。如果是非首次调用,该参数传上次接口返回的nextToken。
|
|
158
|
+
type: string
|
|
159
|
+
required: true
|
|
160
|
+
position: query
|
|
161
|
+
- name: maxResults
|
|
162
|
+
description: 每页返回最大数量。默认10,最大500。
|
|
163
|
+
type: number
|
|
164
|
+
required: false
|
|
165
|
+
position: query
|
|
166
|
+
|
|
167
|
+
- name: listUserProjectTasks
|
|
168
|
+
description: 查询用户项目任务信息列表
|
|
169
|
+
requestTemplate:
|
|
170
|
+
method: POST
|
|
171
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks/search?roleTypes=String&tql=String&nextToken=String&maxResults=String
|
|
172
|
+
args:
|
|
173
|
+
- name: userId
|
|
174
|
+
description: 操作者userId。
|
|
175
|
+
type: string
|
|
176
|
+
required: true
|
|
177
|
+
position: path
|
|
178
|
+
- name: roleTypes
|
|
179
|
+
description: 用户的任务角色。creator、executor、involveMember 中的一个或多个,多个以英文逗号拼接。例如:creator,executor
|
|
180
|
+
type: string
|
|
181
|
+
required: true
|
|
182
|
+
position: query
|
|
183
|
+
- name: nextToken
|
|
184
|
+
description: 分页游标。如果是首次调用,该参数不传。如果是非首次调用,该参数传上次接口返回的nextToken。
|
|
185
|
+
type: string
|
|
186
|
+
required: true
|
|
187
|
+
position: query
|
|
188
|
+
- name: maxResults
|
|
189
|
+
description: 每页返回最大数量。默认10,最大500。
|
|
190
|
+
type: number
|
|
191
|
+
required: false
|
|
192
|
+
position: query
|
|
193
|
+
|
|
194
|
+
- name: queryProjectTaskDetail
|
|
195
|
+
description: 查询项目任务详情
|
|
196
|
+
requestTemplate:
|
|
197
|
+
method: GET
|
|
198
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks?taskId=String
|
|
199
|
+
args:
|
|
200
|
+
- name: userId
|
|
201
|
+
description: 操作者userId。
|
|
202
|
+
type: string
|
|
203
|
+
required: true
|
|
204
|
+
position: path
|
|
205
|
+
- name: taskId
|
|
206
|
+
description: 项目任务ID
|
|
207
|
+
type: string
|
|
208
|
+
required: true
|
|
209
|
+
position: query
|
|
210
|
+
|
|
211
|
+
- name: createProjectTask
|
|
212
|
+
description: 创建项目任务
|
|
213
|
+
requestTemplate:
|
|
214
|
+
method: POST
|
|
215
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks
|
|
216
|
+
args:
|
|
217
|
+
- name: userId
|
|
218
|
+
description: 操作者userId。
|
|
219
|
+
type: string
|
|
220
|
+
required: true
|
|
221
|
+
position: path
|
|
222
|
+
- name: projectId
|
|
223
|
+
description: 项目id。
|
|
224
|
+
type: string
|
|
225
|
+
required: true
|
|
226
|
+
position: body
|
|
227
|
+
- name: content
|
|
228
|
+
description: 任务标题
|
|
229
|
+
type: string
|
|
230
|
+
required: true
|
|
231
|
+
position: body
|
|
232
|
+
- name: note
|
|
233
|
+
description: 任务备注
|
|
234
|
+
type: string
|
|
235
|
+
required: false
|
|
236
|
+
position: body
|
|
237
|
+
- name: startDate
|
|
238
|
+
description: 任务截止时间,格式:YYYY-MM-DDTHH:mm:ssZ(ISO 8601/RFC 3339)。
|
|
239
|
+
type: string
|
|
240
|
+
required: false
|
|
241
|
+
position: body
|
|
242
|
+
- name: dueDate
|
|
243
|
+
description: 任务开始时间,格式:YYYY-MM-DDTHH:mm:ssZ(ISO 8601/RFC 3339)。
|
|
244
|
+
type: string
|
|
245
|
+
required: false
|
|
246
|
+
position: body
|
|
247
|
+
- name: executorId
|
|
248
|
+
description: 任务执行者userId。
|
|
249
|
+
type: string
|
|
250
|
+
required: false
|
|
251
|
+
position: body
|
|
252
|
+
|
|
253
|
+
- name: deleteProjectTask
|
|
254
|
+
description: 删除项目任务
|
|
255
|
+
requestTemplate:
|
|
256
|
+
method: DELETE
|
|
257
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks/{taskId}
|
|
258
|
+
args:
|
|
259
|
+
- name: userId
|
|
260
|
+
description: 操作者userId。
|
|
261
|
+
type: string
|
|
262
|
+
required: true
|
|
263
|
+
position: path
|
|
264
|
+
- name: taskId
|
|
265
|
+
description: 任务ID
|
|
266
|
+
type: string
|
|
267
|
+
required: true
|
|
268
|
+
position: path
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
- name: updateProjectTaskNote
|
|
272
|
+
description: 更新项目任务备注
|
|
273
|
+
requestTemplate:
|
|
274
|
+
method: PUT
|
|
275
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks/{taskId}/notes
|
|
276
|
+
args:
|
|
277
|
+
- name: userId
|
|
278
|
+
description: 操作者userId。
|
|
279
|
+
type: string
|
|
280
|
+
required: true
|
|
281
|
+
position: path
|
|
282
|
+
- name: taskId
|
|
283
|
+
description: 任务ID。
|
|
284
|
+
type: string
|
|
285
|
+
required: true
|
|
286
|
+
position: path
|
|
287
|
+
- name: note
|
|
288
|
+
description: 任务备注
|
|
289
|
+
type: string
|
|
290
|
+
required: true
|
|
291
|
+
position: body
|
|
292
|
+
|
|
293
|
+
- name: updateProjectTaskContent
|
|
294
|
+
description: 更新项目任务标题
|
|
295
|
+
requestTemplate:
|
|
296
|
+
method: PUT
|
|
297
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks/{taskId}/contents
|
|
298
|
+
args:
|
|
299
|
+
- name: userId
|
|
300
|
+
description: 操作者userId。
|
|
301
|
+
type: string
|
|
302
|
+
required: true
|
|
303
|
+
position: path
|
|
304
|
+
- name: taskId
|
|
305
|
+
description: 任务ID。
|
|
306
|
+
type: string
|
|
307
|
+
required: true
|
|
308
|
+
position: path
|
|
309
|
+
- name: content
|
|
310
|
+
description: 任务标题
|
|
311
|
+
type: string
|
|
312
|
+
required: true
|
|
313
|
+
position: body
|
|
314
|
+
|
|
315
|
+
- name: updateProjectTaskExecutors
|
|
316
|
+
description: 更新项目任务执行者
|
|
317
|
+
requestTemplate:
|
|
318
|
+
method: PUT
|
|
319
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks/{taskId}/executors
|
|
320
|
+
args:
|
|
321
|
+
- name: userId
|
|
322
|
+
description: 操作者userId。
|
|
323
|
+
type: string
|
|
324
|
+
required: true
|
|
325
|
+
position: path
|
|
326
|
+
- name: taskId
|
|
327
|
+
description: 任务ID。
|
|
328
|
+
type: string
|
|
329
|
+
required: true
|
|
330
|
+
position: path
|
|
331
|
+
- name: executorId
|
|
332
|
+
description: 任务执行者userId
|
|
333
|
+
type: string
|
|
334
|
+
required: true
|
|
335
|
+
position: body
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
- name: updateProjectTaskInvolveMembers
|
|
339
|
+
description: 更新项目任务参与者
|
|
340
|
+
requestTemplate:
|
|
341
|
+
method: PUT
|
|
342
|
+
url: https://api.dingtalk.com/v1.0/project/users/{userId}/tasks/{taskId}/involveMembers
|
|
343
|
+
args:
|
|
344
|
+
- name: userId
|
|
345
|
+
description: 操作者userId。
|
|
346
|
+
type: string
|
|
347
|
+
required: true
|
|
348
|
+
position: path
|
|
349
|
+
- name: taskId
|
|
350
|
+
description: 任务ID。
|
|
351
|
+
type: string
|
|
352
|
+
required: true
|
|
353
|
+
position: path
|
|
354
|
+
- name: involveMembers
|
|
355
|
+
description: 任务参与者userId列表
|
|
356
|
+
type: array
|
|
357
|
+
required: true
|
|
358
|
+
position: body
|
|
359
|
+
items:
|
|
360
|
+
type: string
|
|
@@ -23,7 +23,11 @@ export class DingTalkMCPServer {
|
|
|
23
23
|
this.debug = process.env.DEBUG;
|
|
24
24
|
// Token缓存配置
|
|
25
25
|
this.tokenCacheFile = path.join(__dirname, '..', '.dingtalk_token_cache.json');
|
|
26
|
-
this.loadConfig();
|
|
26
|
+
this.loadConfig(path.join(__dirname, '..'));
|
|
27
|
+
// 测试状态
|
|
28
|
+
if (process.env.STAGING){
|
|
29
|
+
this.loadConfig(path.join(__dirname, '../staging'));
|
|
30
|
+
}
|
|
27
31
|
this.server = new Server({
|
|
28
32
|
name: 'Dingtalk MCP Server',
|
|
29
33
|
description: "Dingtalk MCP Server, inclued tasks, contacts, calendar, robot etc.",
|
|
@@ -35,7 +39,7 @@ export class DingTalkMCPServer {
|
|
|
35
39
|
this.loadTokenCache();
|
|
36
40
|
this.setupHandlers();
|
|
37
41
|
}
|
|
38
|
-
loadConfig() {
|
|
42
|
+
loadConfig(dirname) {
|
|
39
43
|
try {
|
|
40
44
|
//激活的profile
|
|
41
45
|
const profiles = process.env.ACTIVE_PROFILES;
|
|
@@ -44,7 +48,7 @@ export class DingTalkMCPServer {
|
|
|
44
48
|
profiles_list = profiles.split(',');
|
|
45
49
|
}
|
|
46
50
|
|
|
47
|
-
const configDir = path.join(
|
|
51
|
+
const configDir = path.join(dirname);
|
|
48
52
|
fs.readdirSync(configDir).forEach(
|
|
49
53
|
(file) => {
|
|
50
54
|
if (file.endsWith('mcp_server.yaml')) {
|
|
@@ -118,7 +122,7 @@ export class DingTalkMCPServer {
|
|
|
118
122
|
* 检查token缓存是否有效(未过期)
|
|
119
123
|
*/
|
|
120
124
|
isTokenCacheValid(cacheData) {
|
|
121
|
-
if (!cacheData || !cacheData.access_token || !cacheData.expires_at) {
|
|
125
|
+
if (!cacheData || !cacheData.access_token || !cacheData.expires_at || cacheData.app_id !== this.appId) {
|
|
122
126
|
return false;
|
|
123
127
|
}
|
|
124
128
|
// 提前5分钟刷新token,避免在请求过程中过期
|
|
@@ -314,6 +318,9 @@ export class DingTalkMCPServer {
|
|
|
314
318
|
data: body,
|
|
315
319
|
timeout: 30000
|
|
316
320
|
});
|
|
321
|
+
if (this.debug){
|
|
322
|
+
console.log(response)
|
|
323
|
+
}
|
|
317
324
|
return {
|
|
318
325
|
content: [{
|
|
319
326
|
type: 'text',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dingtalk-mcp",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "DingTalk MCP Server - A TypeScript-based MCP server for DingTalk integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
"files": [
|
|
12
12
|
"dist/**/*",
|
|
13
13
|
"*.yaml",
|
|
14
|
+
"dist/utils",
|
|
14
15
|
"!dist/test.js",
|
|
15
|
-
"
|
|
16
|
+
"!staging"
|
|
16
17
|
],
|
|
17
18
|
"scripts": {
|
|
18
19
|
"build": "tsc",
|
|
@@ -46,17 +47,17 @@
|
|
|
46
47
|
"model-context-protocol",
|
|
47
48
|
"tasks"
|
|
48
49
|
],
|
|
49
|
-
"author": "
|
|
50
|
+
"author": "dingtalk",
|
|
50
51
|
"license": "MIT",
|
|
51
52
|
"engines": {
|
|
52
53
|
"node": ">=16.0.0"
|
|
53
54
|
},
|
|
54
55
|
"repository": {
|
|
55
56
|
"type": "git",
|
|
56
|
-
"url": "
|
|
57
|
+
"url": "https://github.com/open-dingtalk/dingtalk-mcp"
|
|
57
58
|
},
|
|
58
59
|
"bugs": {
|
|
59
|
-
"url": "https://github.com/
|
|
60
|
+
"url": "https://github.com/open-dingtalk/dingtalk-mcp/issues"
|
|
60
61
|
},
|
|
61
|
-
"homepage": "https://
|
|
62
|
+
"homepage": "https://open.dingtalk.com/document/ai-dev/dingtalk-server-api-mcp-overview"
|
|
62
63
|
}
|