@hauptsache.net/clickup-mcp 1.3.0 → 1.3.1

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 CHANGED
@@ -115,21 +115,21 @@ The ClickUp MCP supports three operational modes to balance functionality, secur
115
115
  - **📖 `read`**: Full read-only access for project exploration and workflow understanding
116
116
  - **✏️ `write`** (Default): Complete functionality for task management and productivity workflows
117
117
 
118
- | Tool | read-minimal | read | write | Description |
119
- |------|:------------:|:----:|:-----:|-------------|
120
- | `getTaskById` | | | | Get complete task details including comments, images, and metadata |
121
- | `searchTasks` || | | Find tasks by content, keywords, assignees, or project context |
122
- | `searchSpaces` | || | Browse workspace structure, project organization, and documents |
123
- | `getListInfo` | || | Get list details and available statuses for task creation |
124
- | `getTimeEntries` || | | View time entries and analyze time spent across projects |
125
- | `readDocument` | | | | Get document details, page structure, and content with navigation |
126
- | `searchDocuments` | | | | Search documents by name and space with fuzzy matching and space filtering |
127
- | `createTask` | | | | Create new tasks with full markdown support |
128
- | `updateTask` | || | Update tasks (status, priority, assignees, etc.) with **SAFE APPEND-ONLY** descriptions |
129
- | `updateListInfo` | | | | **SAFE APPEND-ONLY** updates to list descriptions (preserves existing content) |
130
- | `addComment` | || | Add comments to tasks for collaboration |
131
- | `createTimeEntry` | | | | Log time entries for task tracking |
132
- | `writeDocument` | | | | Universal document and page operations with smart document creation |
118
+ | Tool | read-minimal | read | write | Description |
119
+ |-------------------|:------------:|:----:|:-----:|-----------------------------------------------------------------------------------------|
120
+ | `getTaskById` | | | | Get complete task details including comments, images, and metadata |
121
+ | `addComment` || ❌ | | Add comments to tasks for collaboration |
122
+ | `updateTask` | || | Update tasks (status, priority, assignees, etc.) with **SAFE APPEND-ONLY** descriptions |
123
+ | `createTask` | || | Create new tasks with full markdown support |
124
+ | `searchTasks` || | | Find tasks by content, keywords, assignees, or project context |
125
+ | `searchSpaces` | | | | Browse workspace structure, project organization, and documents |
126
+ | `getListInfo` | | | | Get list details and available statuses for task creation |
127
+ | `updateListInfo` | | | | **SAFE APPEND-ONLY** updates to list descriptions (preserves existing content) |
128
+ | `getTimeEntries` | || | View time entries and analyze time spent across projects |
129
+ | `createTimeEntry` | | | | Log time entries for task tracking |
130
+ | `readDocument` | || | Get document details, page structure, and content with navigation |
131
+ | `searchDocuments` | | ✅ | ✅ | Search documents by name and space with fuzzy matching and space filtering |
132
+ | `writeDocument` | | | | Universal document and page operations with smart document creation |
133
133
 
134
134
  ### Setting the Mode
135
135
 
@@ -140,7 +140,7 @@ Add the mode to your MCP configuration:
140
140
  "mcpServers": {
141
141
  "clickup": {
142
142
  "command": "npx",
143
- "args": ["-y", "@hauptsache.net/clickup-mcp@1"],
143
+ "args": ["-y", "@hauptsache.net/clickup-mcp@latest"],
144
144
  "env": {
145
145
  "CLICKUP_API_KEY": "your_api_key",
146
146
  "CLICKUP_TEAM_ID": "your_team_id",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkFpE,QAAA,MAAM,aAAa,oBAAqB,CAAC;AAIzC,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiIpE,QAAA,MAAM,aAAa,oBAAqB,CAAC;AAIzC,OAAO,EAAE,aAAa,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -45,6 +45,47 @@ async function initializeServer() {
45
45
  }, {
46
46
  instructions
47
47
  });
48
+ // Register prompts
49
+ const lang = config_1.CONFIG.primaryLanguageHint === 'de' ? 'de' : 'en';
50
+ // Register "my-todos" prompt
51
+ server.registerPrompt("my-todos", {
52
+ title: lang === 'de' ? "Meine TODOs" : "My TODOs",
53
+ description: lang === 'de'
54
+ ? "Meine aktuellen TODO-Aufgaben aus ClickUp abrufen und nach Priorität kategorisiert analysieren"
55
+ : "Get and analyze my current TODO tasks from ClickUp, categorized by priority",
56
+ argsSchema: {}
57
+ }, () => {
58
+ const messages = [{
59
+ role: "user",
60
+ content: {
61
+ type: "text",
62
+ text: lang === 'de'
63
+ ? `Kannst du in ClickUp nachsehen, was meine aktuellen TODOs sind? Bitte suche nach allen offenen Aufgaben, die mir zugewiesen sind, analysiere deren Inhalt und kategorisiere sie nach erkennbarer Priorität (dringend, hoch, normal, niedrig). Für jede Kategorie gib eine kurze Zusammenfassung dessen, was getan werden muss und hebe Fälligkeitstermine oder wichtige Details aus den Aufgabenbeschreibungen hervor.
64
+
65
+ Bitte strukturiere deine Antwort mit:
66
+ 1. **Zusammenfassung**: Gesamtanzahl der Aufgaben und allgemeine Prioritätsverteilung
67
+ 2. **Dringende Aufgaben**: Aufgaben, die sofortige Aufmerksamkeit benötigen (heute fällig, überfällig oder als dringend markiert)
68
+ 3. **Hohe Priorität**: Wichtige Aufgaben, die bald erledigt werden sollten
69
+ 4. **Normale Priorität**: Regelmäßige Aufgaben, die später geplant werden können
70
+ 5. **Niedrige Priorität**: Aufgaben, die erledigt werden können, wenn Zeit vorhanden ist
71
+ 6. **Empfehlungen**: Vorgeschlagene Maßnahmen oder Prioritäten für den kommenden Zeitraum
72
+
73
+ Verwende die ClickUp-Suchtools, um mir zugewiesene Aufgaben zu finden, und hole detaillierte Informationen über die wichtigsten mit getTaskById.`
74
+ : `Can you look into ClickUp and check what my current TODO's are? Please search for all open tasks assigned to me, analyze their content, and categorize them by apparent priority (urgent, high, normal, low). For each category, provide a brief summary of what needs to be done and highlight any due dates or important details from the task descriptions.
75
+
76
+ Please structure your response with:
77
+ 1. **Summary**: Total number of tasks and overall priority distribution
78
+ 2. **Urgent Tasks**: Tasks that need immediate attention (due today, overdue, or marked as urgent)
79
+ 3. **High Priority**: Important tasks that should be addressed soon
80
+ 4. **Normal Priority**: Regular tasks that can be scheduled for later
81
+ 5. **Low Priority**: Tasks that can be done when time permits
82
+ 6. **Recommendations**: Suggested actions or priorities for the upcoming period
83
+
84
+ Use the ClickUp search tools to find tasks assigned to me, and get detailed information about the most important ones using getTaskById.`
85
+ }
86
+ }];
87
+ return { messages };
88
+ });
48
89
  if (config_1.CONFIG.mode === 'read-minimal') {
49
90
  // Core task context tools for AI coding assistance
50
91
  // Only getTaskById and searchTasks
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,oBAA2D,CAAC;AAavF,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAUxD,eAAO,MAAM,MAAM;;;;;;;CAOlB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,oBAA2D,CAAC;AAkDvF,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAUxD,eAAO,MAAM,MAAM;;;;;;;CAOlB,CAAC"}
@@ -3,13 +3,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CONFIG = exports.rawPrimaryLang = void 0;
4
4
  exports.rawPrimaryLang = process.env.CLICKUP_PRIMARY_LANGUAGE || process.env.LANG;
5
5
  let detectedLanguageHint = undefined;
6
- if (exports.rawPrimaryLang) {
7
- // Extract the primary language part (e.g., 'en' from 'en_US.UTF-8' or 'en-GB')
8
- // and convert to lowercase.
9
- const langPart = exports.rawPrimaryLang.match(/^[a-zA-Z]{2,3}/);
6
+ /**
7
+ * Enhanced language detection that handles various formats and common language names
8
+ */
9
+ function detectLanguage(rawLang) {
10
+ if (!rawLang)
11
+ return undefined;
12
+ const normalizedLang = rawLang.toLowerCase().trim();
13
+ // German language detection
14
+ if (normalizedLang === 'de' || normalizedLang === 'german' || normalizedLang === 'deutsch' || normalizedLang.startsWith('de_') || normalizedLang.startsWith('de-')) {
15
+ return 'de';
16
+ }
17
+ // English language detection
18
+ if (normalizedLang === 'en' || normalizedLang === 'english' || normalizedLang.startsWith('en_') || normalizedLang.startsWith('en-')) {
19
+ return 'en';
20
+ }
21
+ // French language detection
22
+ if (normalizedLang === 'fr' || normalizedLang === 'french' || normalizedLang === 'français' || normalizedLang.startsWith('fr_') || normalizedLang.startsWith('fr-')) {
23
+ return 'fr';
24
+ }
25
+ // Spanish language detection
26
+ if (normalizedLang === 'es' || normalizedLang === 'spanish' || normalizedLang === 'español' || normalizedLang.startsWith('es_') || normalizedLang.startsWith('es-')) {
27
+ return 'es';
28
+ }
29
+ // Italian language detection
30
+ if (normalizedLang === 'it' || normalizedLang === 'italian' || normalizedLang === 'italiano' || normalizedLang.startsWith('it_') || normalizedLang.startsWith('it-')) {
31
+ return 'it';
32
+ }
33
+ // Fallback: extract the primary language part (e.g., 'en' from 'en_US.UTF-8' or 'en-GB')
34
+ const langPart = normalizedLang.match(/^[a-zA-Z]{2,3}/);
10
35
  if (langPart) {
11
- detectedLanguageHint = langPart[0].toLowerCase();
36
+ return langPart[0].toLowerCase();
12
37
  }
38
+ return undefined;
39
+ }
40
+ if (exports.rawPrimaryLang) {
41
+ detectedLanguageHint = detectLanguage(exports.rawPrimaryLang);
13
42
  }
14
43
  const rawMode = process.env.CLICKUP_MCP_MODE?.toLowerCase();
15
44
  let mcpMode = 'write'; // Default to write (full functionality)
@@ -1 +1 @@
1
- {"version":3,"file":"doc-tools.d.ts","sourceRoot":"","sources":["../../src/tools/doc-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoDpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QAiR1D;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QA8O3D"}
1
+ {"version":3,"file":"doc-tools.d.ts","sourceRoot":"","sources":["../../src/tools/doc-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoDpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QAuR1D;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAiP3D"}
@@ -59,6 +59,8 @@ function registerDocumentToolsRead(server) {
59
59
  .string()
60
60
  .optional()
61
61
  .describe("Optional specific page ID or name to read (defaults to first page)")
62
+ }, {
63
+ readOnlyHint: true
62
64
  }, async ({ doc_id, page }) => {
63
65
  try {
64
66
  // First get the document details and page structure
@@ -197,6 +199,8 @@ function registerDocumentToolsRead(server) {
197
199
  .array(zod_1.z.string())
198
200
  .optional()
199
201
  .describe("Filter documents to specific space IDs")
202
+ }, {
203
+ readOnlyHint: true
200
204
  }, async ({ terms, space_ids }) => {
201
205
  try {
202
206
  // Get the document search index
@@ -310,6 +314,8 @@ function registerDocumentToolsWrite(server) {
310
314
  .boolean()
311
315
  .optional()
312
316
  .describe("Whether to append content to existing page content (default: false - replaces content)")
317
+ }, {
318
+ readOnlyHint: false
313
319
  }, async ({ page_id, parent_type, parent_id, page_name, content, append = false }) => {
314
320
  try {
315
321
  // Validate input parameters
@@ -1 +1 @@
1
- {"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../src/tools/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QA+GtD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAyEvD"}
1
+ {"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../src/tools/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAkHtD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QA4EvD"}
@@ -14,6 +14,8 @@ function registerListToolsRead(server) {
14
14
  "Share the clickable list URL when suggesting list-related actions."
15
15
  ].join("\n"), {
16
16
  list_id: zod_1.z.string().min(1).describe("The list ID to get information for")
17
+ }, {
18
+ readOnlyHint: true
17
19
  }, async ({ list_id }) => {
18
20
  try {
19
21
  // Get list details including statuses (try to get markdown content)
@@ -115,6 +117,8 @@ function registerListToolsWrite(server) {
115
117
  ].join("\n"), {
116
118
  list_id: zod_1.z.string().min(1).describe("The list ID to update"),
117
119
  append_description: zod_1.z.string().min(1).describe("Markdown content to APPEND to existing list description (preserves existing content for safety)")
120
+ }, {
121
+ readOnlyHint: false
118
122
  }, async ({ list_id, append_description }) => {
119
123
  try {
120
124
  // Get current list info including description (try to get markdown content)
@@ -1 +1 @@
1
- {"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AASlE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAuLnE"}
1
+ {"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AASlE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QA2LnE"}
@@ -44,6 +44,8 @@ function registerSearchTools(server, userData) {
44
44
  .boolean()
45
45
  .optional()
46
46
  .describe(`Filter for tasks assigned to the current user (${userData.user.username} (${userData.user.id}))`),
47
+ }, {
48
+ readOnlyHint: true
47
49
  }, async ({ terms, list_ids, space_ids, only_todo, status, assigned_to_me }) => {
48
50
  // Get current user ID if filtering by assigned_to_me
49
51
  const assignees = assigned_to_me ? [userData.user.id] : [];
@@ -1 +1 @@
1
- {"version":3,"file":"space-tools.d.ts","sourceRoot":"","sources":["../../src/tools/space-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAiNnD"}
1
+ {"version":3,"file":"space-tools.d.ts","sourceRoot":"","sources":["../../src/tools/space-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAoNnD"}
@@ -16,6 +16,8 @@ function registerSpaceTools(server) {
16
16
  .optional()
17
17
  .describe("Array of search terms to match against space names or IDs. If not provided, returns all spaces."),
18
18
  archived: zod_1.z.boolean().optional().describe("Include archived spaces (default: false)")
19
+ }, {
20
+ readOnlyHint: true
19
21
  }, async ({ terms, archived = false }) => {
20
22
  try {
21
23
  const searchIndex = await (0, utils_1.getSpaceSearchIndex)();
@@ -1 +1 @@
1
- {"version":3,"file":"task-tools.d.ts","sourceRoot":"","sources":["../../src/tools/task-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAyC,MAAM,iBAAiB,CAAC;AAOtF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAwDrE;AA+MD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA+G/H"}
1
+ {"version":3,"file":"task-tools.d.ts","sourceRoot":"","sources":["../../src/tools/task-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAyC,MAAM,iBAAiB,CAAC;AAOtF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QA2DrE;AA+MD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA+G/H"}
@@ -22,6 +22,8 @@ function registerTaskToolsRead(server, userData) {
22
22
  message: "Task ID must be 6-9 alphanumeric characters only"
23
23
  })
24
24
  .describe(`The 6-9 character ID of the task to get without a prefix like "#", "CU-" or "https://app.clickup.com/t/"`),
25
+ }, {
26
+ readOnlyHint: true
25
27
  }, async ({ id }) => {
26
28
  // 1. Load base task content, comment events, and status change events in parallel
27
29
  const [taskDetailContentBlocks, commentEvents, statusChangeEvents] = await Promise.all([
@@ -1 +1 @@
1
- {"version":3,"file":"task-write-tools.d.ts","sourceRoot":"","sources":["../../src/tools/task-write-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QA4StE"}
1
+ {"version":3,"file":"task-write-tools.d.ts","sourceRoot":"","sources":["../../src/tools/task-write-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAqTtE"}
@@ -30,6 +30,8 @@ function registerTaskToolsWrite(server, userData) {
30
30
  })(), {
31
31
  task_id: zod_1.z.string().min(6).max(9).describe("The 6-9 character task ID to comment on"),
32
32
  comment: zod_1.z.string().min(1).describe("The comment text to add to the task"),
33
+ }, {
34
+ readOnlyHint: false
33
35
  }, async ({ task_id, comment }) => {
34
36
  try {
35
37
  const requestBody = {
@@ -105,6 +107,8 @@ function registerTaskToolsWrite(server, userData) {
105
107
  tags: taskTagsSchema.describe("Optional array of tag names (will replace existing tags)"),
106
108
  parent_task_id: zod_1.z.string().optional().describe("Optional parent task ID to change parent/child relationships"),
107
109
  assignees: zod_1.z.array(zod_1.z.string()).optional().describe(createAssigneeDescription(userData))
110
+ }, {
111
+ readOnlyHint: false
108
112
  }, async ({ task_id, name, append_description, status, priority, due_date, start_date, time_estimate, tags, parent_task_id, assignees }) => {
109
113
  try {
110
114
  const userData = await (0, utils_1.getCurrentUser)();
@@ -213,6 +217,8 @@ function registerTaskToolsWrite(server, userData) {
213
217
  tags: taskTagsSchema,
214
218
  parent_task_id: zod_1.z.string().optional().describe("Optional parent task ID to create this as a subtask"),
215
219
  assignees: zod_1.z.array(zod_1.z.string()).optional().describe(createAssigneeDescription(userData))
220
+ }, {
221
+ readOnlyHint: false
216
222
  }, async ({ list_id, name, description, status, priority, due_date, start_date, time_estimate, tags, parent_task_id, assignees }) => {
217
223
  try {
218
224
  const userData = await (0, utils_1.getCurrentUser)();
@@ -1 +1 @@
1
- {"version":3,"file":"time-tools.d.ts","sourceRoot":"","sources":["../../src/tools/time-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0DpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QA6EtD;AAwLD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAmFvD"}
1
+ {"version":3,"file":"time-tools.d.ts","sourceRoot":"","sources":["../../src/tools/time-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0DpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAgFtD;AAwLD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAsFvD"}
@@ -58,6 +58,8 @@ function registerTimeToolsRead(server) {
58
58
  list_id: zod_1.z.string().optional().describe("Optional single list ID to filter time entries by a specific list"),
59
59
  space_id: zod_1.z.string().optional().describe("Optional single space ID to filter time entries by a specific space"),
60
60
  include_all_users: zod_1.z.boolean().optional().describe("Optional flag to include time entries from all team members (default: false, only current user)")
61
+ }, {
62
+ readOnlyHint: true
61
63
  }, async ({ task_id, start_date, end_date, list_id, space_id, include_all_users }) => {
62
64
  try {
63
65
  // Build query parameters
@@ -268,6 +270,8 @@ function registerTimeToolsWrite(server) {
268
270
  hours: zod_1.z.number().min(0.01).max(24).describe("Hours to book (decimal format, e.g., 0.25 = 15min, 1.5 = 1h 30min)"),
269
271
  description: zod_1.z.string().optional().describe("Optional description for the time entry"),
270
272
  start_time: zod_1.z.string().optional().describe("Optional start time as ISO date string (e.g., '2024-10-06T09:00:00+02:00', defaults to current time)")
273
+ }, {
274
+ readOnlyHint: false
271
275
  }, async ({ task_id, hours, description, start_time }) => {
272
276
  try {
273
277
  // Convert hours to milliseconds (ClickUp API uses milliseconds)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hauptsache.net/clickup-mcp",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Search, create, and retrieve tasks, add comments, and track time through natural language commands.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "license": "MIT",
40
40
  "dependencies": {
41
- "@modelcontextprotocol/sdk": "^1.9.0",
41
+ "@modelcontextprotocol/sdk": "^1.15.1",
42
42
  "fuse.js": "^7.1.0",
43
43
  "zod": "^3.24.2"
44
44
  },