dingtalk-mcp-server 0.1.0

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.
@@ -0,0 +1,193 @@
1
+ /**
2
+ * 钉钉API封装
3
+ */
4
+ import axios from 'axios';
5
+ export class DingTalkAPI {
6
+ client;
7
+ appKey;
8
+ appSecret;
9
+ agentId;
10
+ accessToken = null;
11
+ tokenExpireTime = 0;
12
+ constructor(appKey, appSecret, agentId) {
13
+ this.appKey = appKey;
14
+ this.appSecret = appSecret;
15
+ this.agentId = agentId;
16
+ this.client = axios.create({
17
+ baseURL: 'https://oapi.dingtalk.com',
18
+ timeout: 10000,
19
+ });
20
+ }
21
+ /**
22
+ * 获取access_token
23
+ */
24
+ async getAccessToken() {
25
+ // 如果token还有效,直接返回
26
+ if (this.accessToken && Date.now() < this.tokenExpireTime) {
27
+ return this.accessToken;
28
+ }
29
+ const response = await this.client.get('/gettoken', {
30
+ params: {
31
+ appkey: this.appKey,
32
+ appsecret: this.appSecret,
33
+ },
34
+ });
35
+ if (response.data.errcode !== 0) {
36
+ throw new Error(`获取token失败: ${response.data.errmsg}`);
37
+ }
38
+ this.accessToken = response.data.access_token;
39
+ this.tokenExpireTime = Date.now() + (response.data.expires_in - 300) * 1000; // 提前5分钟过期
40
+ return this.accessToken;
41
+ }
42
+ /**
43
+ * 发送消息
44
+ */
45
+ async sendMessage(params) {
46
+ const token = await this.getAccessToken();
47
+ const data = {
48
+ agent_id: this.agentId,
49
+ msgtype: params.msgtype,
50
+ [params.msgtype]: params.content,
51
+ };
52
+ if (params.userid) {
53
+ data.userid_list = params.userid;
54
+ }
55
+ if (params.chatid) {
56
+ data.chatid = params.chatid;
57
+ }
58
+ const response = await this.client.post('/topapi/message/corpconversation/asyncsend_v2', data, { params: { access_token: token } });
59
+ if (response.data.errcode !== 0) {
60
+ throw new Error(`发送消息失败: ${response.data.errmsg}`);
61
+ }
62
+ return response.data;
63
+ }
64
+ /**
65
+ * 发送文本消息
66
+ */
67
+ async sendTextMessage(userid, content) {
68
+ return this.sendMessage({
69
+ userid,
70
+ msgtype: 'text',
71
+ content: { content },
72
+ });
73
+ }
74
+ /**
75
+ * 发送Markdown消息
76
+ */
77
+ async sendMarkdownMessage(userid, title, content) {
78
+ return this.sendMessage({
79
+ userid,
80
+ msgtype: 'markdown',
81
+ content: { title, text: content },
82
+ });
83
+ }
84
+ /**
85
+ * 获取会话列表
86
+ */
87
+ async getConversations() {
88
+ // 实际API需要根据钉钉文档实现
89
+ // 这里返回模拟数据
90
+ return [];
91
+ }
92
+ /**
93
+ * 获取联系人
94
+ */
95
+ async getContacts() {
96
+ const token = await this.getAccessToken();
97
+ const response = await this.client.post('/topapi/v2/user/list', {
98
+ dept_id: 1,
99
+ cursor: 0,
100
+ size: 100,
101
+ }, { params: { access_token: token } });
102
+ if (response.data.errcode !== 0) {
103
+ throw new Error(`获取联系人失败: ${response.data.errmsg}`);
104
+ }
105
+ return response.data.result?.list || [];
106
+ }
107
+ /**
108
+ * 创建待办
109
+ */
110
+ async createTodo(params) {
111
+ const token = await this.getAccessToken();
112
+ const response = await this.client.post('/topapi/workrecord/create', {
113
+ agent_id: this.agentId,
114
+ ...params,
115
+ }, { params: { access_token: token } });
116
+ if (response.data.errcode !== 0) {
117
+ throw new Error(`创建待办失败: ${response.data.errmsg}`);
118
+ }
119
+ return response.data;
120
+ }
121
+ /**
122
+ * 获取待办列表
123
+ */
124
+ async getTodoList(userid, status) {
125
+ const token = await this.getAccessToken();
126
+ const response = await this.client.post('/topapi/workrecord/getbyuser', {
127
+ userid,
128
+ status: status || 0, // 0: 未完成, 1: 已完成
129
+ offset: 0,
130
+ limit: 100,
131
+ }, { params: { access_token: token } });
132
+ if (response.data.errcode !== 0) {
133
+ throw new Error(`获取待办失败: ${response.data.errmsg}`);
134
+ }
135
+ return response.data.result?.records || [];
136
+ }
137
+ /**
138
+ * 更新待办状态
139
+ */
140
+ async updateTodo(recordId, status) {
141
+ const token = await this.getAccessToken();
142
+ const response = await this.client.post('/topapi/workrecord/update', {
143
+ agent_id: this.agentId,
144
+ record_id: recordId,
145
+ status,
146
+ }, { params: { access_token: token } });
147
+ if (response.data.errcode !== 0) {
148
+ throw new Error(`更新待办失败: ${response.data.errmsg}`);
149
+ }
150
+ return response.data;
151
+ }
152
+ /**
153
+ * 创建日程
154
+ */
155
+ async createCalendarEvent(params) {
156
+ const token = await this.getAccessToken();
157
+ const response = await this.client.post('/topapi/calendar/create', {
158
+ ...params,
159
+ source: { title: 'Claude Code', url: 'https://claude.ai' },
160
+ }, { params: { access_token: token } });
161
+ if (response.data.errcode !== 0) {
162
+ throw new Error(`创建日程失败: ${response.data.errmsg}`);
163
+ }
164
+ return response.data;
165
+ }
166
+ /**
167
+ * 获取日程列表
168
+ */
169
+ async getCalendarEvents(userid, startTime, endTime) {
170
+ const token = await this.getAccessToken();
171
+ const response = await this.client.post('/topapi/calendar/list', {
172
+ userids: [userid],
173
+ start_time: startTime,
174
+ end_time: endTime,
175
+ }, { params: { access_token: token } });
176
+ if (response.data.errcode !== 0) {
177
+ throw new Error(`获取日程失败: ${response.data.errmsg}`);
178
+ }
179
+ return response.data.result?.events || [];
180
+ }
181
+ /**
182
+ * 获取用户ID
183
+ */
184
+ async getUserId(code) {
185
+ const token = await this.getAccessToken();
186
+ const response = await this.client.post('/topapi/v2/user/getuserinfo', { code }, { params: { access_token: token } });
187
+ if (response.data.errcode !== 0) {
188
+ throw new Error(`获取用户ID失败: ${response.data.errmsg}`);
189
+ }
190
+ return response.data.result?.userid;
191
+ }
192
+ }
193
+ //# sourceMappingURL=dingtalk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dingtalk.js","sourceRoot":"","sources":["../../src/utils/dingtalk.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "dingtalk-mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "钉钉MCP服务器 - 让Claude Code能操作钉钉(消息/待办/日程)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "dingtalk-mcp-server": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/index.js",
19
+ "prepare": "npm run build",
20
+ "test": "node dist/examples/test-tools.js",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.0.4",
25
+ "axios": "^1.6.2",
26
+ "crypto-js": "^4.2.0",
27
+ "zod": "^3.22.4"
28
+ },
29
+ "devDependencies": {
30
+ "@types/crypto-js": "^4.2.1",
31
+ "@types/node": "^20.10.4",
32
+ "typescript": "^5.3.3"
33
+ },
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ },
37
+ "keywords": [
38
+ "mcp",
39
+ "mcp-server",
40
+ "dingtalk",
41
+ "claude",
42
+ "claude-code",
43
+ "cline",
44
+ "ai",
45
+ "钉钉"
46
+ ],
47
+ "homepage": "https://github.com/yourusername/dingtalk-mcp-server#readme",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "https://github.com/yourusername/dingtalk-mcp-server.git"
51
+ },
52
+ "bugs": {
53
+ "url": "https://github.com/yourusername/dingtalk-mcp-server/issues"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ }
58
+ }