@taazkareem/clickup-mcp-server 0.4.40 → 0.4.42
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/LICENSE +21 -0
- package/README.md +28 -45
- package/build/index.js +302 -5
- package/package.json +8 -5
- package/build/utils/logger.js +0 -41
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 taazkareem
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -2,14 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
A Model Context Protocol (MCP) server for integrating ClickUp tasks with AI applications. This server allows AI agents to interact with ClickUp tasks, spaces, lists, and folders through a standardized protocol.
|
|
4
4
|
|
|
5
|
-
## Quick Start
|
|
6
|
-
```bash
|
|
7
|
-
npx clickup-mcp-server --stdio --env CLICKUP_API_KEY=your_api_key_here --env TEAM_ID=your_team_id_here
|
|
8
|
-
```
|
|
9
|
-
That's it! No installation needed. Just replace the credentials with your own:
|
|
10
|
-
- Get your API key from [ClickUp Settings](https://app.clickup.com/settings/apps)
|
|
11
|
-
- Find your Team ID in your ClickUp workspace URL or settings
|
|
12
|
-
|
|
13
5
|
## Features
|
|
14
6
|
|
|
15
7
|
- 🔄 **Resource Management**
|
|
@@ -51,42 +43,36 @@ That's it! No installation needed. Just replace the credentials with your own:
|
|
|
51
43
|
- Secure API key management
|
|
52
44
|
- Environment-based configuration
|
|
53
45
|
|
|
46
|
+
## Installation
|
|
47
|
+
|
|
48
|
+
### Using npx
|
|
49
|
+
```bash
|
|
50
|
+
npx @taazkareem/clickup-mcp-server
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Configuration
|
|
54
|
+
|
|
55
|
+
1. Get your ClickUp API key from [ClickUp Settings](https://app.clickup.com/settings/apps)
|
|
56
|
+
2. Create a `.env` file:
|
|
57
|
+
```env
|
|
58
|
+
CLICKUP_API_KEY=your_api_key_here
|
|
59
|
+
TEAM_ID=your_team_id_here
|
|
60
|
+
```
|
|
61
|
+
|
|
54
62
|
## Using with Cursor AI Composer Agent
|
|
55
63
|
|
|
56
|
-
To add this server to Cursor AI Composer:
|
|
57
|
-
|
|
58
|
-
1. Go to Features
|
|
59
|
-
2.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
To add this server to Roo Code:
|
|
69
|
-
|
|
70
|
-
1. Open Roo Code (formerly Cline).
|
|
71
|
-
2. Ask Roo Code to add the ClickUp MCP Server to your project. It should add this to your `cline_mcp_settings.json` file:
|
|
72
|
-
```json
|
|
73
|
-
"clickup-mcp-server": {
|
|
74
|
-
"command": "npx",
|
|
75
|
-
"args": [
|
|
76
|
-
"clickup-mcp-server",
|
|
77
|
-
"--stdio"
|
|
78
|
-
],
|
|
79
|
-
"env": {
|
|
80
|
-
"CLICKUP_API_KEY": "your_api_key_here",
|
|
81
|
-
"TEAM_ID": "your_team_id_here"
|
|
82
|
-
},
|
|
83
|
-
"disabled": false,
|
|
84
|
-
"alwaysAllow": []
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
4. Replace `your_api_key_here` and `your_team_id_here` with your actual ClickUp API key and Team ID.
|
|
88
|
-
**Note:** Do not use the example settings and credentials provided here; use your own.
|
|
89
|
-
5. Save the `cline_mcp_settings.json` file.
|
|
64
|
+
To add this server to Cursor AI Composer, follow these steps:
|
|
65
|
+
|
|
66
|
+
1. Go to the Features section in the settings.
|
|
67
|
+
2. Add the following command under MCP Servers:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx -y @taazkareem/clickup-mcp-server --stdio \
|
|
71
|
+
--env CLICKUP_API_KEY=your_api_key_here \
|
|
72
|
+
--env TEAM_ID=your_team_id_here
|
|
73
|
+
```
|
|
74
|
+
3. Replace `your_api_key_here` and `your_team_id_here` with your actual ClickUp credentials.
|
|
75
|
+
4. Click on 'Save' to add the server.
|
|
90
76
|
|
|
91
77
|
> **Security Note**: Your API key will be stored securely and will not be exposed to AI models.
|
|
92
78
|
|
|
@@ -252,6 +238,3 @@ Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md)
|
|
|
252
238
|
## License
|
|
253
239
|
|
|
254
240
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
255
|
-
|
|
256
|
-
## Support My Work! 👍
|
|
257
|
-
Solana Wallet: GjtRksihd7SWQw7hJSCDMcTxPHbgpNs7xPW3nFubNjVM
|
package/build/index.js
CHANGED
|
@@ -29,9 +29,307 @@ const server = new Server({
|
|
|
29
29
|
version: "0.1.0",
|
|
30
30
|
}, {
|
|
31
31
|
capabilities: {
|
|
32
|
-
resources: {
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
resources: {
|
|
33
|
+
list: true,
|
|
34
|
+
read: true,
|
|
35
|
+
},
|
|
36
|
+
tools: {
|
|
37
|
+
workspace_hierarchy: {
|
|
38
|
+
description: "List complete hierarchy of the ClickUp workspace",
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: "object",
|
|
41
|
+
properties: {},
|
|
42
|
+
required: []
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
create_task: {
|
|
46
|
+
description: "Create a new task in ClickUp",
|
|
47
|
+
inputSchema: {
|
|
48
|
+
type: "object",
|
|
49
|
+
properties: {
|
|
50
|
+
listId: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description: "ID of the list to create the task in (optional if listName is provided)"
|
|
53
|
+
},
|
|
54
|
+
listName: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "Name of the list to create the task in (optional if listId is provided)"
|
|
57
|
+
},
|
|
58
|
+
name: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "Name of the task"
|
|
61
|
+
},
|
|
62
|
+
description: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Description of the task"
|
|
65
|
+
},
|
|
66
|
+
status: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Status of the task"
|
|
69
|
+
},
|
|
70
|
+
priority: {
|
|
71
|
+
type: "number",
|
|
72
|
+
description: "Priority of the task (1-4)"
|
|
73
|
+
},
|
|
74
|
+
dueDate: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Due date of the task (ISO string)"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
required: ["name"]
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
create_bulk_tasks: {
|
|
83
|
+
description: "Create multiple tasks in a ClickUp list",
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: "object",
|
|
86
|
+
properties: {
|
|
87
|
+
listId: {
|
|
88
|
+
type: "string",
|
|
89
|
+
description: "ID of the list to create the tasks in (optional if listName is provided)"
|
|
90
|
+
},
|
|
91
|
+
listName: {
|
|
92
|
+
type: "string",
|
|
93
|
+
description: "Name of the list to create the tasks in (optional if listId is provided)"
|
|
94
|
+
},
|
|
95
|
+
tasks: {
|
|
96
|
+
type: "array",
|
|
97
|
+
description: "Array of tasks to create",
|
|
98
|
+
items: {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: {
|
|
101
|
+
name: {
|
|
102
|
+
type: "string",
|
|
103
|
+
description: "Name of the task"
|
|
104
|
+
},
|
|
105
|
+
description: {
|
|
106
|
+
type: "string",
|
|
107
|
+
description: "Description of the task"
|
|
108
|
+
},
|
|
109
|
+
status: {
|
|
110
|
+
type: "string",
|
|
111
|
+
description: "Status of the task"
|
|
112
|
+
},
|
|
113
|
+
priority: {
|
|
114
|
+
type: "number",
|
|
115
|
+
description: "Priority level (1-4)"
|
|
116
|
+
},
|
|
117
|
+
dueDate: {
|
|
118
|
+
type: "string",
|
|
119
|
+
description: "Due date (ISO string)"
|
|
120
|
+
},
|
|
121
|
+
assignees: {
|
|
122
|
+
type: "array",
|
|
123
|
+
items: {
|
|
124
|
+
type: "number"
|
|
125
|
+
},
|
|
126
|
+
description: "Array of user IDs to assign to the task"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
required: ["name"]
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
required: ["tasks"]
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
create_list: {
|
|
137
|
+
description: "Create a new list in a ClickUp space",
|
|
138
|
+
inputSchema: {
|
|
139
|
+
type: "object",
|
|
140
|
+
properties: {
|
|
141
|
+
spaceId: {
|
|
142
|
+
type: "string",
|
|
143
|
+
description: "ID of the space to create the list in (optional if spaceName is provided)"
|
|
144
|
+
},
|
|
145
|
+
spaceName: {
|
|
146
|
+
type: "string",
|
|
147
|
+
description: "Name of the space to create the list in (optional if spaceId is provided)"
|
|
148
|
+
},
|
|
149
|
+
name: {
|
|
150
|
+
type: "string",
|
|
151
|
+
description: "Name of the list"
|
|
152
|
+
},
|
|
153
|
+
content: {
|
|
154
|
+
type: "string",
|
|
155
|
+
description: "Description or content of the list"
|
|
156
|
+
},
|
|
157
|
+
dueDate: {
|
|
158
|
+
type: "string",
|
|
159
|
+
description: "Due date for the list (ISO string)"
|
|
160
|
+
},
|
|
161
|
+
priority: {
|
|
162
|
+
type: "number",
|
|
163
|
+
description: "Priority of the list (1-4)"
|
|
164
|
+
},
|
|
165
|
+
assignee: {
|
|
166
|
+
type: "number",
|
|
167
|
+
description: "User ID to assign the list to"
|
|
168
|
+
},
|
|
169
|
+
status: {
|
|
170
|
+
type: "string",
|
|
171
|
+
description: "Status of the list"
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
required: ["name"]
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
create_folder: {
|
|
178
|
+
description: "Create a new folder in a ClickUp space",
|
|
179
|
+
inputSchema: {
|
|
180
|
+
type: "object",
|
|
181
|
+
properties: {
|
|
182
|
+
spaceId: {
|
|
183
|
+
type: "string",
|
|
184
|
+
description: "ID of the space to create the folder in (optional if spaceName is provided)"
|
|
185
|
+
},
|
|
186
|
+
spaceName: {
|
|
187
|
+
type: "string",
|
|
188
|
+
description: "Name of the space to create the folder in (optional if spaceId is provided)"
|
|
189
|
+
},
|
|
190
|
+
name: {
|
|
191
|
+
type: "string",
|
|
192
|
+
description: "Name of the folder"
|
|
193
|
+
},
|
|
194
|
+
override_statuses: {
|
|
195
|
+
type: "boolean",
|
|
196
|
+
description: "Whether to override space statuses"
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
required: ["name"]
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
create_list_in_folder: {
|
|
203
|
+
description: "Create a new list in a ClickUp folder",
|
|
204
|
+
inputSchema: {
|
|
205
|
+
type: "object",
|
|
206
|
+
properties: {
|
|
207
|
+
folderId: {
|
|
208
|
+
type: "string",
|
|
209
|
+
description: "ID of the folder to create the list in (optional if folderName and spaceId/spaceName are provided)"
|
|
210
|
+
},
|
|
211
|
+
folderName: {
|
|
212
|
+
type: "string",
|
|
213
|
+
description: "Name of the folder to create the list in"
|
|
214
|
+
},
|
|
215
|
+
spaceId: {
|
|
216
|
+
type: "string",
|
|
217
|
+
description: "ID of the space containing the folder (required if using folderName)"
|
|
218
|
+
},
|
|
219
|
+
spaceName: {
|
|
220
|
+
type: "string",
|
|
221
|
+
description: "Name of the space containing the folder (alternative to spaceId)"
|
|
222
|
+
},
|
|
223
|
+
name: {
|
|
224
|
+
type: "string",
|
|
225
|
+
description: "Name of the list"
|
|
226
|
+
},
|
|
227
|
+
content: {
|
|
228
|
+
type: "string",
|
|
229
|
+
description: "Description or content of the list"
|
|
230
|
+
},
|
|
231
|
+
status: {
|
|
232
|
+
type: "string",
|
|
233
|
+
description: "Status of the list"
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
required: ["name"]
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
move_task: {
|
|
240
|
+
description: "Move a task to a different list",
|
|
241
|
+
inputSchema: {
|
|
242
|
+
type: "object",
|
|
243
|
+
properties: {
|
|
244
|
+
taskId: {
|
|
245
|
+
type: "string",
|
|
246
|
+
description: "ID of the task to move"
|
|
247
|
+
},
|
|
248
|
+
listId: {
|
|
249
|
+
type: "string",
|
|
250
|
+
description: "ID of the destination list (optional if listName is provided)"
|
|
251
|
+
},
|
|
252
|
+
listName: {
|
|
253
|
+
type: "string",
|
|
254
|
+
description: "Name of the destination list (optional if listId is provided)"
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
required: ["taskId"]
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
duplicate_task: {
|
|
261
|
+
description: "Duplicate a task to a list",
|
|
262
|
+
inputSchema: {
|
|
263
|
+
type: "object",
|
|
264
|
+
properties: {
|
|
265
|
+
taskId: {
|
|
266
|
+
type: "string",
|
|
267
|
+
description: "ID of the task to duplicate"
|
|
268
|
+
},
|
|
269
|
+
listId: {
|
|
270
|
+
type: "string",
|
|
271
|
+
description: "ID of the destination list (optional if listName is provided)"
|
|
272
|
+
},
|
|
273
|
+
listName: {
|
|
274
|
+
type: "string",
|
|
275
|
+
description: "Name of the destination list (optional if listId is provided)"
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
required: ["taskId"]
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
update_task: {
|
|
282
|
+
description: "Update an existing task in ClickUp",
|
|
283
|
+
inputSchema: {
|
|
284
|
+
type: "object",
|
|
285
|
+
properties: {
|
|
286
|
+
taskId: {
|
|
287
|
+
type: "string",
|
|
288
|
+
description: "ID of the task to update"
|
|
289
|
+
},
|
|
290
|
+
name: {
|
|
291
|
+
type: "string",
|
|
292
|
+
description: "New name of the task"
|
|
293
|
+
},
|
|
294
|
+
description: {
|
|
295
|
+
type: "string",
|
|
296
|
+
description: "New description of the task"
|
|
297
|
+
},
|
|
298
|
+
status: {
|
|
299
|
+
type: "string",
|
|
300
|
+
description: "New status of the task"
|
|
301
|
+
},
|
|
302
|
+
priority: {
|
|
303
|
+
type: "number",
|
|
304
|
+
description: "New priority of the task (1-4)"
|
|
305
|
+
},
|
|
306
|
+
dueDate: {
|
|
307
|
+
type: "string",
|
|
308
|
+
description: "New due date of the task (ISO string)"
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
required: ["taskId"]
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
prompts: {
|
|
316
|
+
summarize_tasks: {
|
|
317
|
+
description: "Summarize tasks in the workspace",
|
|
318
|
+
inputSchema: {
|
|
319
|
+
type: "object",
|
|
320
|
+
properties: {},
|
|
321
|
+
required: []
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
analyze_priorities: {
|
|
325
|
+
description: "Analyze task priorities",
|
|
326
|
+
inputSchema: {
|
|
327
|
+
type: "object",
|
|
328
|
+
properties: {},
|
|
329
|
+
required: []
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
},
|
|
35
333
|
},
|
|
36
334
|
});
|
|
37
335
|
console.log('MCP server created');
|
|
@@ -585,13 +883,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
585
883
|
if (!args.taskId) {
|
|
586
884
|
throw new Error("taskId is required");
|
|
587
885
|
}
|
|
588
|
-
const dueDate = args.due_date ? new Date(args.due_date).getTime() : undefined;
|
|
589
886
|
const task = await clickup.updateTask(args.taskId, {
|
|
590
887
|
name: args.name,
|
|
591
888
|
description: args.description,
|
|
592
889
|
status: args.status,
|
|
593
890
|
priority: args.priority,
|
|
594
|
-
due_date:
|
|
891
|
+
due_date: args.due_date
|
|
595
892
|
});
|
|
596
893
|
return {
|
|
597
894
|
content: [{
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taazkareem/clickup-mcp-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.42",
|
|
4
4
|
"description": "ClickUp MCP Server - Integrate ClickUp tasks with AI through Model Context Protocol",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "build/index.js",
|
|
6
|
+
"main": "./build/index.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"clickup-mcp-server": "build/index.js"
|
|
8
|
+
"clickup-mcp-server": "build/index.js",
|
|
9
|
+
"@taazkareem/clickup-mcp-server": "build/index.js"
|
|
9
10
|
},
|
|
10
11
|
"files": [
|
|
11
12
|
"build",
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
"license": "MIT",
|
|
36
37
|
"repository": {
|
|
37
38
|
"type": "git",
|
|
38
|
-
"url": "https://github.com/taazkareem/clickup-mcp-server.git"
|
|
39
|
+
"url": "git+https://github.com/taazkareem/clickup-mcp-server.git"
|
|
39
40
|
},
|
|
40
41
|
"bugs": {
|
|
41
42
|
"url": "https://github.com/taazkareem/clickup-mcp-server/issues"
|
|
@@ -43,8 +44,10 @@
|
|
|
43
44
|
"homepage": "https://github.com/taazkareem/clickup-mcp-server#readme",
|
|
44
45
|
"dependencies": {
|
|
45
46
|
"@modelcontextprotocol/sdk": "^1.4.1",
|
|
47
|
+
"@modelcontextprotocol/server-github": "^2025.1.23",
|
|
46
48
|
"axios": "^1.6.7",
|
|
47
|
-
"dotenv": "^16.4.1"
|
|
49
|
+
"dotenv": "^16.4.1",
|
|
50
|
+
"zod": "^3.24.2"
|
|
48
51
|
},
|
|
49
52
|
"devDependencies": {
|
|
50
53
|
"@types/node": "^20.11.16",
|
package/build/utils/logger.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
class Logger {
|
|
2
|
-
logLevel = 'info';
|
|
3
|
-
setLogLevel(level) {
|
|
4
|
-
this.logLevel = level;
|
|
5
|
-
}
|
|
6
|
-
shouldLog(level) {
|
|
7
|
-
const levels = {
|
|
8
|
-
debug: 0,
|
|
9
|
-
info: 1,
|
|
10
|
-
warn: 2,
|
|
11
|
-
error: 3
|
|
12
|
-
};
|
|
13
|
-
return levels[level] >= levels[this.logLevel];
|
|
14
|
-
}
|
|
15
|
-
formatMessage(level, message, ...args) {
|
|
16
|
-
const timestamp = new Date().toISOString();
|
|
17
|
-
const formattedArgs = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg).join(' ');
|
|
18
|
-
return `[${timestamp}] ${level.toUpperCase()}: ${message} ${formattedArgs}`.trim();
|
|
19
|
-
}
|
|
20
|
-
debug(message, ...args) {
|
|
21
|
-
if (this.shouldLog('debug')) {
|
|
22
|
-
console.debug(this.formatMessage('debug', message, ...args));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
info(message, ...args) {
|
|
26
|
-
if (this.shouldLog('info')) {
|
|
27
|
-
console.info(this.formatMessage('info', message, ...args));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
warn(message, ...args) {
|
|
31
|
-
if (this.shouldLog('warn')) {
|
|
32
|
-
console.warn(this.formatMessage('warn', message, ...args));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
error(message, ...args) {
|
|
36
|
-
if (this.shouldLog('error')) {
|
|
37
|
-
console.error(this.formatMessage('error', message, ...args));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
export const logger = new Logger();
|