@studiometa/productive-mcp 0.10.2 → 0.10.3

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/dist/schema.d.ts CHANGED
@@ -27,7 +27,9 @@ export declare const ResourceSchema: z.ZodEnum<{
27
27
  attachments: "attachments";
28
28
  discussions: "discussions";
29
29
  pages: "pages";
30
+ activities: "activities";
30
31
  batch: "batch";
32
+ workflows: "workflows";
31
33
  reports: "reports";
32
34
  summaries: "summaries";
33
35
  search: "search";
@@ -49,6 +51,9 @@ export declare const ActionSchema: z.ZodEnum<{
49
51
  reopen: "reopen";
50
52
  run: "run";
51
53
  me: "me";
54
+ complete_task: "complete_task";
55
+ log_day: "log_day";
56
+ weekly_standup: "weekly_standup";
52
57
  help: "help";
53
58
  schema: "schema";
54
59
  my_day: "my_day";
@@ -171,7 +176,9 @@ export declare const ProductiveToolInputSchema: z.ZodObject<{
171
176
  attachments: "attachments";
172
177
  discussions: "discussions";
173
178
  pages: "pages";
179
+ activities: "activities";
174
180
  batch: "batch";
181
+ workflows: "workflows";
175
182
  reports: "reports";
176
183
  summaries: "summaries";
177
184
  search: "search";
@@ -189,6 +196,9 @@ export declare const ProductiveToolInputSchema: z.ZodObject<{
189
196
  reopen: "reopen";
190
197
  run: "run";
191
198
  me: "me";
199
+ complete_task: "complete_task";
200
+ log_day: "log_day";
201
+ weekly_standup: "weekly_standup";
192
202
  help: "help";
193
203
  schema: "schema";
194
204
  my_day: "my_day";
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,CAAC,EAAoB,KAAK,kBAAkB,EAAE,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAGlF,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAMhF;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAAoB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAAkB,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAAuB,CAAC;AAMrD;;GAEG;AACH,eAAO,MAAM,OAAO,aAIgC,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,aAAa,aAKvB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,aAKxB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,aAGqD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,WAAW,aAG+C,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,cAAc,aAGuD,CAAC;AAEnF;;GAEG;AACH,eAAO,MAAM,WAAW,aAG+C,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,SAAS,aAIuC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,gBAAgB,aAKiE,CAAC;AAE/F;;GAEG;AACH,eAAO,MAAM,SAAS,2BAKiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,YAAY,2BAMsC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,YAAY,6BAKtB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,UAAU,aAMpB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,wCAKxB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,6BAKtB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,yBAItB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,SAAS,aAAkD,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,UAAU,aAIqB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,SAAS,aAGgB,CAAC;AAMvC;;GAEG;AACH,eAAO,MAAM,YAAY,uDAGsB,CAAC;AAMhD;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqFpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAM5E;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAErE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,CAE7F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAOnF"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,CAAC,EAAoB,KAAK,kBAAkB,EAAE,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAGlF,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAMhF;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;EAAoB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;EAAkB,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAAuB,CAAC;AAMrD;;GAEG;AACH,eAAO,MAAM,OAAO,aAIgC,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,aAAa,aAKvB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,aAKxB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,aAGqD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,WAAW,aAG+C,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,cAAc,aAGuD,CAAC;AAEnF;;GAEG;AACH,eAAO,MAAM,WAAW,aAG+C,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,SAAS,aAIuC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,gBAAgB,aAKiE,CAAC;AAE/F;;GAEG;AACH,eAAO,MAAM,SAAS,2BAKiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,YAAY,2BAMsC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,YAAY,6BAKtB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,UAAU,aAMpB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,cAAc,wCAKxB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,6BAKtB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,yBAItB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,SAAS,aAAkD,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,UAAU,aAIqB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,SAAS,aAGgB,CAAC;AAMvC;;GAEG;AACH,eAAO,MAAM,YAAY,uDAGsB,CAAC;AAMhD;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqFpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAM5E;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAErE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,CAE7F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAOnF"}
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { t as VERSION } from "./version-Bl0krPVf.js";
3
- import "./handlers-B8GRTaDu.js";
2
+ import { t as VERSION } from "./version-BRTaTnUG.js";
3
+ import "./handlers-CaOBYauF.js";
4
4
  import { createHttpApp } from "./http.js";
5
5
  import { toNodeListener } from "h3";
6
6
  import { createServer } from "node:http";
package/dist/stdio.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as executeToolWithCredentials } from "./handlers-B8GRTaDu.js";
1
+ import { t as executeToolWithCredentials } from "./handlers-CaOBYauF.js";
2
2
  import "./handlers.js";
3
3
  import { STDIO_ONLY_TOOLS, TOOLS } from "./tools.js";
4
4
  import { getConfig, setConfig } from "@studiometa/productive-api";
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Proactive suggestion generators for MCP responses.
3
+ *
4
+ * Data-aware warnings and recommendations computed from response data.
5
+ * Different from `_hints` (which show related resources/actions):
6
+ * - `_hints` tell the agent *what to fetch next*
7
+ * - `_suggestions` tell the agent *what to pay attention to*
8
+ *
9
+ * Key design constraints:
10
+ * - No extra API calls — compute only from data already in the response.
11
+ * - Return `string[]` (human-readable messages).
12
+ * - Emoji prefixes: ⚠️ warnings, ℹ️ info, 📊 stats, ⏱️ timers.
13
+ */
14
+ import type { JsonApiResource } from '@studiometa/productive-api';
15
+ import type { MyDaySummaryResult } from '@studiometa/productive-core';
16
+ /**
17
+ * Get suggestions for tasks.list response.
18
+ *
19
+ * - Warns about overdue tasks (due_date < today and not closed)
20
+ * - Informs about unassigned tasks
21
+ */
22
+ export declare function getTaskListSuggestions(tasks: JsonApiResource[]): string[];
23
+ /**
24
+ * Get suggestions for tasks.get response.
25
+ *
26
+ * - Warns if the single task is overdue (and by how many days)
27
+ * - Informs if no time has been logged (only when time_entries are included)
28
+ */
29
+ export declare function getTaskGetSuggestions(task: JsonApiResource, included?: JsonApiResource[]): string[];
30
+ /**
31
+ * Get suggestions for time.list response.
32
+ *
33
+ * - Shows total hours logged across all entries in the response.
34
+ * - If filtered by today, shows hours vs 8h target.
35
+ */
36
+ export declare function getTimeListSuggestions(entries: JsonApiResource[], filter?: Record<string, string>): string[];
37
+ /**
38
+ * Get suggestions for summaries.my_day response.
39
+ *
40
+ * - Warns if no time has been logged today.
41
+ * - Warns if a timer has been running for more than 2 hours.
42
+ */
43
+ export declare function getMyDaySuggestions(data: MyDaySummaryResult): string[];
44
+ //# sourceMappingURL=suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../src/suggestions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAStE;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAqCzE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,EACrB,QAAQ,CAAC,EAAE,eAAe,EAAE,GAC3B,MAAM,EAAE,CAkCV;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,EAAE,CAwBV;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAoBtE"}
@@ -23,7 +23,7 @@ function loadInstructions() {
23
23
  }
24
24
  }
25
25
  const INSTRUCTIONS = loadInstructions();
26
- const VERSION = "0.10.2";
26
+ const VERSION = "0.10.3";
27
27
  export { INSTRUCTIONS as n, VERSION as t };
28
28
 
29
- //# sourceMappingURL=version-Bl0krPVf.js.map
29
+ //# sourceMappingURL=version-BRTaTnUG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-Bl0krPVf.js","names":[],"sources":["../src/instructions.ts","../src/version.ts"],"sourcesContent":["/**\n * MCP Server Instructions\n *\n * These instructions are sent to Claude Desktop during initialization\n * and used as context/hints for the LLM. This ensures the AI agent\n * knows how to properly use the Productive.io MCP server.\n *\n * The content is derived from skills/SKILL.md (without YAML frontmatter).\n */\n\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Load instructions from SKILL.md file\n * Removes YAML frontmatter (content between --- markers)\n */\nfunction loadInstructions(): string {\n try {\n // In dist/, go up to package root, then to skills/\n const skillPath = join(__dirname, '..', 'skills', 'SKILL.md');\n const content = readFileSync(skillPath, 'utf-8');\n\n // Remove YAML frontmatter (between --- markers at start of file)\n const withoutFrontmatter = content.replace(/^---\\n[\\s\\S]*?\\n---\\n+/, '');\n\n return withoutFrontmatter.trim();\n } catch {\n // Fallback if file not found (shouldn't happen in production)\n return 'Productive.io MCP Server - Use the productive tool with resource and action parameters.';\n }\n}\n\nexport const INSTRUCTIONS = loadInstructions();\n","/**\n * Package version - injected from package.json at build time\n */\ndeclare const __VERSION__: string;\nexport const VERSION = __VERSION__;\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;;;;;AAMzD,SAAS,mBAA2B;AAClC,KAAI;AAQF,SALgB,aADE,KAAK,WAAW,MAAM,UAAU,WAAW,EACrB,QAAQ,CAGb,QAAQ,0BAA0B,GAAG,CAE9C,MAAM;SAC1B;AAEN,SAAO;;;AAIX,MAAa,eAAe,kBAAkB;AChC9C,MAAa,UAAA"}
1
+ {"version":3,"file":"version-BRTaTnUG.js","names":[],"sources":["../src/instructions.ts","../src/version.ts"],"sourcesContent":["/**\n * MCP Server Instructions\n *\n * These instructions are sent to Claude Desktop during initialization\n * and used as context/hints for the LLM. This ensures the AI agent\n * knows how to properly use the Productive.io MCP server.\n *\n * The content is derived from skills/SKILL.md (without YAML frontmatter).\n */\n\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Load instructions from SKILL.md file\n * Removes YAML frontmatter (content between --- markers)\n */\nfunction loadInstructions(): string {\n try {\n // In dist/, go up to package root, then to skills/\n const skillPath = join(__dirname, '..', 'skills', 'SKILL.md');\n const content = readFileSync(skillPath, 'utf-8');\n\n // Remove YAML frontmatter (between --- markers at start of file)\n const withoutFrontmatter = content.replace(/^---\\n[\\s\\S]*?\\n---\\n+/, '');\n\n return withoutFrontmatter.trim();\n } catch {\n // Fallback if file not found (shouldn't happen in production)\n return 'Productive.io MCP Server - Use the productive tool with resource and action parameters.';\n }\n}\n\nexport const INSTRUCTIONS = loadInstructions();\n","/**\n * Package version - injected from package.json at build time\n */\ndeclare const __VERSION__: string;\nexport const VERSION = __VERSION__;\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;;;;;AAMzD,SAAS,mBAA2B;AAClC,KAAI;AAQF,SALgB,aADE,KAAK,WAAW,MAAM,UAAU,WAAW,EACrB,QAAQ,CAGb,QAAQ,0BAA0B,GAAG,CAE9C,MAAM;SAC1B;AAEN,SAAO;;;AAIX,MAAa,eAAe,kBAAkB;AChC9C,MAAa,UAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiometa/productive-mcp",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "MCP server for Productive.io API - Model Context Protocol integration for Claude Desktop",
5
5
  "keywords": [
6
6
  "ai",
@@ -87,8 +87,8 @@
87
87
  },
88
88
  "dependencies": {
89
89
  "@modelcontextprotocol/sdk": "^1.26.0",
90
- "@studiometa/productive-api": "0.10.2",
91
- "@studiometa/productive-core": "0.10.2",
90
+ "@studiometa/productive-api": "0.10.3",
91
+ "@studiometa/productive-core": "0.10.3",
92
92
  "h3": "^1.15.1",
93
93
  "zod": "4.3.6"
94
94
  },
package/skills/SKILL.md CHANGED
@@ -36,7 +36,9 @@ productive(resource, action, [parameters...])
36
36
  | `bookings` | `list`, `get`, `create`, `update`, `help` | Resource scheduling |
37
37
  | `pages` | `list`, `get`, `create`, `update`, `delete`, `help` | Wiki/docs pages |
38
38
  | `discussions` | `list`, `get`, `create`, `update`, `delete`, `resolve`, `reopen`, `help` | Discussions on pages |
39
+ | `activities` | `list`, `help` | Activity feed (audit log of create/update/delete events) |
39
40
  | `reports` | `get`, `help` | Generate reports |
41
+ | `workflows` | `complete_task`, `log_day`, `weekly_standup`, `help` | Compound workflows chaining multiple operations |
40
42
 
41
43
  ### Getting Help
42
44
 
@@ -252,6 +254,13 @@ Response:
252
254
  ### Services
253
255
 
254
256
  ```json
257
+ // List services for a deal (budget line items) — prefer this over project_id when you have a deal
258
+ {
259
+ "resource": "services",
260
+ "action": "list",
261
+ "filter": { "deal_id": "12345" }
262
+ }
263
+
255
264
  // List services for a project
256
265
  {
257
266
  "resource": "services",
@@ -372,6 +381,78 @@ Response:
372
381
  { "resource": "discussions", "action": "reopen", "id": "67890" }
373
382
  ```
374
383
 
384
+ ### Workflows
385
+
386
+ Compound workflows that chain multiple operations into a single tool call.
387
+
388
+ ```json
389
+ // Complete a task (marks closed, posts comment, stops timers)
390
+ {
391
+ "resource": "workflows",
392
+ "action": "complete_task",
393
+ "task_id": "12345",
394
+ "comment": "All done! Tests passing.",
395
+ "stop_timer": true
396
+ }
397
+
398
+ // Complete a task without stopping timers
399
+ {
400
+ "resource": "workflows",
401
+ "action": "complete_task",
402
+ "task_id": "12345",
403
+ "stop_timer": false
404
+ }
405
+
406
+ // Log a full day across multiple services (time in minutes)
407
+ {
408
+ "resource": "workflows",
409
+ "action": "log_day",
410
+ "date": "2024-01-16",
411
+ "entries": [
412
+ { "project_id": "100", "service_id": "111", "duration_minutes": 240, "note": "Frontend development" },
413
+ { "project_id": "100", "service_id": "222", "duration_minutes": 120, "note": "Code review" },
414
+ { "project_id": "200", "service_id": "333", "duration_minutes": 60, "note": "Client meeting" }
415
+ ]
416
+ }
417
+
418
+ // Get weekly standup (this week)
419
+ { "resource": "workflows", "action": "weekly_standup" }
420
+
421
+ // Get standup for a specific week (provide the Monday date)
422
+ {
423
+ "resource": "workflows",
424
+ "action": "weekly_standup",
425
+ "week_start": "2024-01-15"
426
+ }
427
+
428
+ // Get standup for a specific person
429
+ {
430
+ "resource": "workflows",
431
+ "action": "weekly_standup",
432
+ "person_id": "12345"
433
+ }
434
+ ```
435
+
436
+ #### complete_task returns
437
+
438
+ - `task` — Updated task info (id, title, closed status)
439
+ - `comment_posted` — Whether the comment was successfully posted
440
+ - `comment_id` — ID of the created comment (if posted)
441
+ - `timers_stopped` — Number of timers that were stopped
442
+ - `errors` — Array of sub-step errors (partial results still returned)
443
+
444
+ #### log_day returns
445
+
446
+ - `entries` — Per-entry results with `success`, `time_entry` (on success), or `error` (on failure)
447
+ - `succeeded` / `failed` — Counts of successful and failed entries
448
+ - `total_minutes_logged` — Sum of minutes for successful entries
449
+
450
+ #### weekly_standup returns
451
+
452
+ - `completed_tasks` — Tasks closed this week with project names
453
+ - `time_logged` — Total minutes and breakdown by project (sorted by most time first)
454
+ - `upcoming_deadlines` — Open tasks due in the next 7 days with `days_until_due`
455
+
375
456
  ## Filters Reference
376
457
 
377
458
  ### Time Entries
@@ -510,6 +591,28 @@ Force full details on list:
510
591
 
511
592
  When fetching a single resource with `action: "get"`, the response includes a `_hints` field with suggestions for related resources and common actions. This helps discover how to fetch additional context.
512
593
 
594
+ ## Proactive Suggestions
595
+
596
+ Certain responses include a `_suggestions` field with data-aware warnings and recommendations. Unlike `_hints` (which point to related resources), `_suggestions` draw attention to things that need action based on the data returned.
597
+
598
+ | Resource | Action | Suggestions generated |
599
+ | ----------- | -------- | ---------------------------------------------------- |
600
+ | `tasks` | `list` | ⚠️ overdue tasks count, ℹ️ unassigned tasks count |
601
+ | `tasks` | `get` | ⚠️ task is N days overdue, ℹ️ no time entries |
602
+ | `time` | `list` | 📊 total hours logged (or X/8h if filtered by today) |
603
+ | `summaries` | `my_day` | ⚠️ no time logged today, ⏱️ timer running too long |
604
+
605
+ Example:
606
+
607
+ ```json
608
+ {
609
+ "data": [{ "id": "1", "title": "Fix bug", "due_date": "2024-01-01" }],
610
+ "_suggestions": ["⚠️ 1 task(s) are overdue", "ℹ️ 1 task(s) have no assignee"]
611
+ }
612
+ ```
613
+
614
+ Suggestions are suppressed when `no_hints: true` is set.
615
+
513
616
  Example response for a task:
514
617
 
515
618
  ```json
@@ -688,3 +791,4 @@ Key points:
688
791
  4. **Use `query`** for text search - behavior varies by resource but may include related fields (e.g., tasks query may match project names)
689
792
  5. **Check `people.me`** first to get the current user's ID for filters
690
793
  6. **Follow `_hints`** - When getting a resource, check the `_hints` field for suggestions on fetching related context
794
+ 7. **Act on `_suggestions`** - When present, `_suggestions` highlight data issues (overdue tasks, no time logged, etc.) that may need attention or should be surfaced to the user