ideablast-mcp-server 1.0.1 → 1.0.2

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
@@ -4,7 +4,7 @@ Connect Claude to IdeaBlast to create ideas, brainstorm, and plan your day — f
4
4
 
5
5
  ## Requirements
6
6
 
7
- - **OS:** Windows, macOS, or Linux (desktop only — not mobile)
7
+ - **OS:** Windows or macOS (desktop only — not mobile or Linux)
8
8
  - **Node.js** v18+ installed ([download](https://nodejs.org))
9
9
  - **Claude Desktop** ([download](https://claude.ai/download)) or **Claude Code** (CLI)
10
10
  - IdeaBlast open in a browser **on the same PC** where the MCP server runs
@@ -0,0 +1,5 @@
1
+ import type { ActionItem } from './types.js';
2
+ export declare function getAll(): ActionItem[];
3
+ export declare function add(item: Omit<ActionItem, 'id' | 'createdAt'>): ActionItem;
4
+ export declare function remove(id: string): boolean;
5
+ export declare function count(): number;
@@ -0,0 +1,57 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const DATA_DIR = path.join(__dirname, '..', 'data');
7
+ const ACTIONS_PATH = path.join(DATA_DIR, 'actions.json');
8
+ function ensureDataDir() {
9
+ if (!fs.existsSync(DATA_DIR)) {
10
+ fs.mkdirSync(DATA_DIR, { recursive: true });
11
+ }
12
+ }
13
+ function readActions() {
14
+ ensureDataDir();
15
+ if (!fs.existsSync(ACTIONS_PATH)) {
16
+ return { items: [], lastModified: new Date().toISOString() };
17
+ }
18
+ try {
19
+ const raw = fs.readFileSync(ACTIONS_PATH, 'utf-8');
20
+ return JSON.parse(raw);
21
+ }
22
+ catch {
23
+ return { items: [], lastModified: new Date().toISOString() };
24
+ }
25
+ }
26
+ function writeActions(data) {
27
+ ensureDataDir();
28
+ data.lastModified = new Date().toISOString();
29
+ fs.writeFileSync(ACTIONS_PATH, JSON.stringify(data, null, 2), 'utf-8');
30
+ }
31
+ export function getAll() {
32
+ return readActions().items;
33
+ }
34
+ export function add(item) {
35
+ const data = readActions();
36
+ const newItem = {
37
+ ...item,
38
+ id: uuidv4(),
39
+ createdAt: new Date().toISOString(),
40
+ };
41
+ data.items.push(newItem);
42
+ writeActions(data);
43
+ return newItem;
44
+ }
45
+ export function remove(id) {
46
+ const data = readActions();
47
+ const index = data.items.findIndex(item => item.id === id);
48
+ if (index === -1)
49
+ return false;
50
+ data.items.splice(index, 1);
51
+ writeActions(data);
52
+ return true;
53
+ }
54
+ export function count() {
55
+ return readActions().items.length;
56
+ }
57
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import express from 'express';
2
2
  import cors from 'cors';
3
3
  import { getAll, remove, count, saveSnapshot } from './inbox.js';
4
+ import { getAll as getActions, remove as removeAction } from './actions.js';
4
5
  export function startHttpBridge(port = 3456) {
5
6
  const app = express();
6
7
  // CORS: allow any localhost origin (Vite dev, production, etc.)
@@ -46,7 +47,7 @@ export function startHttpBridge(port = 3456) {
46
47
  res.status(404).json({ success: false, error: 'Item not found' });
47
48
  }
48
49
  });
49
- // Receive snapshot from browser (for future "read ideas" tools)
50
+ // Receive snapshot from browser (for "read ideas" tools)
50
51
  app.post('/api/snapshot', (req, res) => {
51
52
  const ideas = req.body?.ideas;
52
53
  if (!ideas || !Array.isArray(ideas)) {
@@ -56,6 +57,21 @@ export function startHttpBridge(port = 3456) {
56
57
  saveSnapshot(ideas);
57
58
  res.json({ success: true, count: ideas.length });
58
59
  });
60
+ // Get all pending actions (updates queued by Claude)
61
+ app.get('/api/actions', (_req, res) => {
62
+ const items = getActions();
63
+ res.json({ items, count: items.length });
64
+ });
65
+ // Acknowledge (consume) an action
66
+ app.delete('/api/actions/:id', (req, res) => {
67
+ const removed = removeAction(req.params.id);
68
+ if (removed) {
69
+ res.json({ success: true, id: req.params.id });
70
+ }
71
+ else {
72
+ res.status(404).json({ success: false, error: 'Action not found' });
73
+ }
74
+ });
59
75
  app.listen(port, '127.0.0.1', () => {
60
76
  console.error(`[IdeaBlast MCP] HTTP bridge running on http://127.0.0.1:${port}`);
61
77
  console.error(`[IdeaBlast MCP] Health: http://127.0.0.1:${port}/api/health`);
@@ -1 +1 @@
1
- {"version":3,"file":"http-bridge.js","sourceRoot":"","sources":["../src/http-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-bridge.js","sourceRoot":"","sources":["../src/http-bridge.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,13 +11,20 @@ const server = new Server({
11
11
  capabilities: {
12
12
  tools: {},
13
13
  },
14
- instructions: `You are connected to IdeaBlast, a personal idea management app. Use these tools to add ideas, sticky notes, and plans directly into the user's IdeaBlast app.
14
+ instructions: `You are connected to IdeaBlast, a personal idea management app. You can READ their ideas and UPDATE them, plus create new ones.
15
15
 
16
- IMPORTANT: When the user asks you to "create an idea", "add an idea", "save an idea", or anything related to creating/adding ideas in IdeaBlast — use the create_idea tool. Do NOT build apps, write code, or create files. Just call create_idea with the idea text.
16
+ READING: Use read_ideas, search_ideas, get_stats, or weekly_summary to see what the user has.
17
+ UPDATING: Use update_idea to mark ideas done/favorite, edit text, add tags, or delete.
18
+ CREATING: Use create_idea, brainstorm, daily_plan, create_sticky_note, or create_kanban_card.
19
+
20
+ IMPORTANT: When the user asks to "show my ideas", "what ideas do I have", "search for ideas", "how am I doing", or wants you to review their content — use the READ tools first. When they want to change existing ideas — use update_idea with the ID from the read results.
17
21
 
18
22
  Examples:
19
- - "Create an idea about AI" → use create_idea with text about AI
20
- - "Add an idea about marketing strategies" → use create_idea
23
+ - "Show me my ideas" → use read_ideas
24
+ - "What ideas do I have about marketing?" → use search_ideas with query "marketing"
25
+ - "How am I doing?" → use get_stats
26
+ - "Mark idea xyz as done" → use update_idea with id "xyz" and action "toggle_done"
27
+ - "Create an idea about AI" → use create_idea
21
28
  - "Brainstorm ideas about productivity" → use brainstorm
22
29
  - "Plan my day" → use daily_plan
23
30
  - "Add a sticky note: buy groceries" → use create_sticky_note`,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;IACD,YAAY,EAAE;;;;;;;;;8DAS4C;CAC3D,CACF,CAAA;AAED,wBAAwB;AACxB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;KACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,0BAA0B;AAC1B,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAEhD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAA+B,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE,EAAE,CAAC;YACxE,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,uDAAuD;AACvD,eAAe,CAAC,IAAI,CAAC,CAAA;AAErB,+BAA+B;AAC/B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAA;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;IACD,YAAY,EAAE;;;;;;;;;;;;;;;;8DAgB4C;CAC3D,CACF,CAAA;AAED,wBAAwB;AACxB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;KACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,0BAA0B;AAC1B,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAEhD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAA+B,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE,EAAE,CAAC;YACxE,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,uDAAuD;AACvD,eAAe,CAAC,IAAI,CAAC,CAAA;AAErB,+BAA+B;AAC/B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAA;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const createKanbanCard: ToolDefinition;
@@ -0,0 +1,63 @@
1
+ import { add } from '../inbox.js';
2
+ export const createKanbanCard = {
3
+ name: 'create_kanban_card',
4
+ description: 'Create a card in the Kanban board. Use when the user says "add to kanban", "create kanban task", or wants to move an idea into their project board.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ title: {
9
+ type: 'string',
10
+ description: 'Card title (required)',
11
+ },
12
+ description: {
13
+ type: 'string',
14
+ description: 'Card description (optional)',
15
+ },
16
+ column: {
17
+ type: 'string',
18
+ enum: ['todo', 'in-progress', 'review', 'done'],
19
+ description: 'Which column to add the card to. Default: todo',
20
+ },
21
+ ideaId: {
22
+ type: 'string',
23
+ description: 'Optional: link to an existing idea by ID (from read_ideas)',
24
+ },
25
+ },
26
+ required: ['title'],
27
+ },
28
+ handler: async (args) => {
29
+ const title = args.title;
30
+ const description = args.description;
31
+ const column = args.column || 'todo';
32
+ const ideaId = args.ideaId;
33
+ if (!title || title.trim().length === 0) {
34
+ return {
35
+ content: [{
36
+ type: 'text',
37
+ text: 'Error: card title cannot be empty.',
38
+ }],
39
+ isError: true,
40
+ };
41
+ }
42
+ const item = add({
43
+ type: 'sticky_note',
44
+ text: description || title,
45
+ stickyColor: column === 'done' ? 'green' : column === 'in-progress' ? 'blue' : column === 'review' ? 'orange' : 'yellow',
46
+ source: 'kanban',
47
+ });
48
+ const columnNames = {
49
+ 'todo': 'To Do',
50
+ 'in-progress': 'In Progress',
51
+ 'review': 'Review',
52
+ 'done': 'Done',
53
+ };
54
+ const ideaLink = ideaId ? `\nLinked to idea ID: ${ideaId}` : '';
55
+ return {
56
+ content: [{
57
+ type: 'text',
58
+ text: `Kanban card created!\n\nTitle: ${title}\nColumn: ${columnNames[column]}\n${description ? `Description: ${description}\n` : ''}ID: ${item.id}${ideaLink}\n\nThe card will appear in your Kanban board when IdeaBlast syncs.`,
59
+ }],
60
+ };
61
+ },
62
+ };
63
+ //# sourceMappingURL=create-kanban-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-kanban-card.js","sourceRoot":"","sources":["../../src/tools/create-kanban-card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAGjC,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,qJAAqJ;IAClK,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uBAAuB;aACrC;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6BAA6B;aAC3C;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAC/C,WAAW,EAAE,gDAAgD;aAC9D;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4DAA4D;aAC1E;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;IACD,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAA;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAqB,CAAA;QAC9C,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,MAAM,CAAA;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAA;QAEpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oCAAoC;qBAC3C,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC;YACf,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,WAAW,IAAI,KAAK;YAC1B,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACxH,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,MAAM;SACf,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAE/D,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kCAAkC,KAAK,aAAa,WAAW,CAAC,MAAkC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,GAAG,QAAQ,qEAAqE;iBAC/P,CAAC;SACH,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const getStats: ToolDefinition;
@@ -0,0 +1,74 @@
1
+ import { getSnapshot } from '../inbox.js';
2
+ export const getStats = {
3
+ name: 'get_stats',
4
+ description: 'Get productivity statistics from IdeaBlast. Use when the user asks "how am I doing", "what are my stats", "show my progress", or wants productivity insights.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {},
8
+ },
9
+ handler: async () => {
10
+ const snapshot = getSnapshot();
11
+ if (!snapshot || snapshot.ideas.length === 0) {
12
+ return {
13
+ content: [{
14
+ type: 'text',
15
+ text: 'No ideas found for stats. Make sure MCP Sync is enabled in IdeaBlast.',
16
+ }],
17
+ };
18
+ }
19
+ const ideas = snapshot.ideas;
20
+ const total = ideas.length;
21
+ const done = ideas.filter(i => i.isDone).length;
22
+ const favorites = ideas.filter(i => i.isFavorite).length;
23
+ const active = ideas.filter(i => !i.isDone).length;
24
+ const withDeadline = ideas.filter(i => i.deadline).length;
25
+ const overdue = ideas.filter(i => i.deadline && !i.isDone && new Date(i.deadline) < new Date()).length;
26
+ // Tag stats
27
+ const allTags = ideas.flatMap(i => i.tags || []);
28
+ const tagCounts = {};
29
+ allTags.forEach(tag => {
30
+ tagCounts[tag] = (tagCounts[tag] || 0) + 1;
31
+ });
32
+ const topTags = Object.entries(tagCounts)
33
+ .sort(([, a], [, b]) => b - a)
34
+ .slice(0, 5)
35
+ .map(([tag, count]) => `${tag}: ${count}`)
36
+ .join(', ');
37
+ // Completion rate
38
+ const completionRate = total > 0 ? Math.round((done / total) * 100) : 0;
39
+ // Recent activity (last 7 days)
40
+ const weekAgo = new Date();
41
+ weekAgo.setDate(weekAgo.getDate() - 7);
42
+ const recent = ideas.filter(i => new Date(i.createdAt) > weekAgo).length;
43
+ const report = `📊 **IdeaBlast Stats** (as of ${new Date().toLocaleDateString()})
44
+
45
+ **Overview**
46
+ - Total ideas: ${total}
47
+ - ✅ Completed: ${done} (${completionRate}%)
48
+ - ⭐ Favorites: ${favorites}
49
+ - 🎯 Active: ${active}
50
+ - 📅 With deadlines: ${withDeadline}
51
+ - ⚠️ Overdue: ${overdue}
52
+
53
+ **Tags** (top 5)
54
+ ${topTags || 'No tags yet'}
55
+
56
+ **Recent Activity**
57
+ - 📈 Ideas created this week: ${recent}
58
+
59
+ **Insights**
60
+ ${completionRate >= 70 ? '🔥 Great completion rate! Keep it up!' :
61
+ completionRate >= 50 ? '👍 Good progress. Try to complete more active ideas.' :
62
+ '💡 Consider focusing on completing existing ideas before creating new ones.'}
63
+ ${overdue > 0 ? `\n⚠️ You have ${overdue} overdue items. Consider reviewing and rescheduling.` : ''}
64
+
65
+ Last synced: ${snapshot.updatedAt}`;
66
+ return {
67
+ content: [{
68
+ type: 'text',
69
+ text: report,
70
+ }],
71
+ };
72
+ },
73
+ };
74
+ //# sourceMappingURL=get-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stats.js","sourceRoot":"","sources":["../../src/tools/get-stats.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,27 @@ import { brainstorm } from './brainstorm.js';
4
4
  import { dailyPlan } from './daily-plan.js';
5
5
  import { listPending } from './list-pending.js';
6
6
  import { clearPending } from './clear-pending.js';
7
+ import { readIdeas } from './read-ideas.js';
8
+ import { searchIdeas } from './search-ideas.js';
9
+ import { getStats } from './get-stats.js';
10
+ import { updateIdea } from './update-idea.js';
11
+ import { createKanbanCard } from './create-kanban-card.js';
12
+ import { weeklySummary } from './weekly-summary.js';
7
13
  // All tools registered here - add new tools by importing and adding to this array
8
14
  export const allTools = [
15
+ // Read operations
16
+ readIdeas,
17
+ searchIdeas,
18
+ getStats,
19
+ weeklySummary,
20
+ // Write operations
9
21
  createIdea,
10
22
  createSticky,
11
23
  brainstorm,
12
24
  dailyPlan,
25
+ createKanbanCard,
26
+ updateIdea,
27
+ // Management
13
28
  listPending,
14
29
  clearPending,
15
30
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAgBjD,kFAAkF;AAClF,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;IACT,WAAW;IACX,YAAY;CACb,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAgBnD,kFAAkF;AAClF,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,kBAAkB;IAClB,SAAS;IACT,WAAW;IACX,QAAQ;IACR,aAAa;IAEb,mBAAmB;IACnB,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,UAAU;IAEV,aAAa;IACb,WAAW;IACX,YAAY;CACb,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const readIdeas: ToolDefinition;
@@ -0,0 +1,64 @@
1
+ import { getSnapshot } from '../inbox.js';
2
+ export const readIdeas = {
3
+ name: 'read_ideas',
4
+ description: 'Read all ideas currently stored in IdeaBlast. Use this when the user asks to "show my ideas", "list my ideas", "what ideas do I have", or wants you to review their content. Returns all ideas with their status (done, favorite), tags, and deadlines.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ filter: {
9
+ type: 'string',
10
+ enum: ['all', 'active', 'done', 'favorites'],
11
+ description: 'Filter ideas by status. Default: all',
12
+ },
13
+ limit: {
14
+ type: 'number',
15
+ description: 'Maximum number of ideas to return. Default: 50',
16
+ },
17
+ },
18
+ },
19
+ handler: async (args) => {
20
+ const snapshot = getSnapshot();
21
+ if (!snapshot || snapshot.ideas.length === 0) {
22
+ return {
23
+ content: [{
24
+ type: 'text',
25
+ text: 'No ideas found. The snapshot may be empty — make sure MCP Sync is enabled in IdeaBlast so the app sends its data to the server.',
26
+ }],
27
+ };
28
+ }
29
+ const filter = args.filter || 'all';
30
+ const limit = args.limit || 50;
31
+ let ideas = snapshot.ideas;
32
+ switch (filter) {
33
+ case 'active':
34
+ ideas = ideas.filter(i => !i.isDone);
35
+ break;
36
+ case 'done':
37
+ ideas = ideas.filter(i => i.isDone);
38
+ break;
39
+ case 'favorites':
40
+ ideas = ideas.filter(i => i.isFavorite);
41
+ break;
42
+ }
43
+ const total = ideas.length;
44
+ ideas = ideas.slice(0, limit);
45
+ const list = ideas.map((idea, i) => {
46
+ const status = [];
47
+ if (idea.isDone)
48
+ status.push('✅ Done');
49
+ if (idea.isFavorite)
50
+ status.push('⭐ Favorite');
51
+ const tags = idea.tags?.length ? ` [${idea.tags.join(', ')}]` : '';
52
+ const deadline = idea.deadline ? ` 📅 ${idea.deadline.split('T')[0]}` : '';
53
+ const statusStr = status.length ? ` (${status.join(', ')})` : '';
54
+ return `${i + 1}. ${idea.text}${statusStr}${tags}${deadline}\n ID: ${idea.id}`;
55
+ }).join('\n\n');
56
+ return {
57
+ content: [{
58
+ type: 'text',
59
+ text: `Found ${total} ideas (showing ${ideas.length}, filter: ${filter}):\n\nLast synced: ${snapshot.updatedAt}\n\n${list}`,
60
+ }],
61
+ };
62
+ },
63
+ };
64
+ //# sourceMappingURL=read-ideas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-ideas.js","sourceRoot":"","sources":["../../src/tools/read-ideas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,yPAAyP;IACtQ,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC;gBAC5C,WAAW,EAAE,sCAAsC;aACpD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;SACF;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;QAE9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iIAAiI;qBACxI,CAAC;aACH,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,KAAK,CAAA;QAC/C,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAA;QAE1C,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAE1B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ;gBACX,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;gBACpC,MAAK;YACP,KAAK,MAAM;gBACT,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;gBACnC,MAAK;YACP,KAAK,WAAW;gBACd,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;gBACvC,MAAK;QACT,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;QAC1B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAE7B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,MAAM,GAAG,EAAE,CAAA;YACjB,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtC,IAAI,IAAI,CAAC,UAAU;gBAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAChE,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,YAAY,IAAI,CAAC,EAAE,EAAE,CAAA;QAClF,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEf,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,KAAK,mBAAmB,KAAK,CAAC,MAAM,aAAa,MAAM,sBAAsB,QAAQ,CAAC,SAAS,OAAO,IAAI,EAAE;iBAC5H,CAAC;SACH,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const searchIdeas: ToolDefinition;
@@ -0,0 +1,69 @@
1
+ import { getSnapshot } from '../inbox.js';
2
+ export const searchIdeas = {
3
+ name: 'search_ideas',
4
+ description: 'Search ideas by text or tags. Use when the user asks to "find ideas about X", "search for ideas", "what ideas do I have about marketing", etc. Returns matching ideas with their IDs for further actions.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ query: {
9
+ type: 'string',
10
+ description: 'Search query text. Searches in idea content and tags.',
11
+ },
12
+ tag: {
13
+ type: 'string',
14
+ description: 'Filter by a specific tag name.',
15
+ },
16
+ limit: {
17
+ type: 'number',
18
+ description: 'Maximum results. Default: 20.',
19
+ },
20
+ },
21
+ required: ['query'],
22
+ },
23
+ handler: async (args) => {
24
+ const snapshot = getSnapshot();
25
+ if (!snapshot || snapshot.ideas.length === 0) {
26
+ return {
27
+ content: [{
28
+ type: 'text',
29
+ text: 'No ideas found to search. Make sure MCP Sync is enabled in IdeaBlast.',
30
+ }],
31
+ };
32
+ }
33
+ const query = args.query.toLowerCase();
34
+ const tag = args.tag;
35
+ const limit = args.limit || 20;
36
+ let results = snapshot.ideas.filter(idea => {
37
+ const textMatch = idea.text.toLowerCase().includes(query);
38
+ const tagMatch = tag ? idea.tags?.some(t => t.toLowerCase() === tag.toLowerCase()) : true;
39
+ return textMatch && tagMatch;
40
+ });
41
+ const total = results.length;
42
+ results = results.slice(0, limit);
43
+ if (results.length === 0) {
44
+ return {
45
+ content: [{
46
+ type: 'text',
47
+ text: `No ideas found for query: "${query}"${tag ? ` with tag: ${tag}` : ''}`,
48
+ }],
49
+ };
50
+ }
51
+ const list = results.map((idea, i) => {
52
+ const status = [];
53
+ if (idea.isDone)
54
+ status.push('Done');
55
+ if (idea.isFavorite)
56
+ status.push('Favorite');
57
+ const tags = idea.tags?.length ? ` [${idea.tags.join(', ')}]` : '';
58
+ const statusStr = status.length ? ` (${status.join(', ')})` : '';
59
+ return `${i + 1}. ${idea.text}${statusStr}${tags}\n ID: ${idea.id}`;
60
+ }).join('\n\n');
61
+ return {
62
+ content: [{
63
+ type: 'text',
64
+ text: `Found ${total} ideas matching "${query}"${tag ? ` (tag: ${tag})` : ''} (showing ${results.length}):\n\n${list}`,
65
+ }],
66
+ };
67
+ },
68
+ };
69
+ //# sourceMappingURL=search-ideas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-ideas.js","sourceRoot":"","sources":["../../src/tools/search-ideas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const updateIdea: ToolDefinition;
@@ -0,0 +1,90 @@
1
+ import { add } from '../actions.js';
2
+ import { getSnapshot } from '../inbox.js';
3
+ export const updateIdea = {
4
+ name: 'update_idea',
5
+ description: 'Update an existing idea in IdeaBlast. Use to mark as done/favorite, edit text, add tags, or delete. The idea will be updated when IdeaBlast polls for actions.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ id: {
10
+ type: 'string',
11
+ description: 'The ID of the idea to update (get this from read_ideas or search_ideas)',
12
+ },
13
+ action: {
14
+ type: 'string',
15
+ enum: ['toggle_done', 'toggle_favorite', 'edit_text', 'add_tag', 'delete'],
16
+ description: 'What action to perform on the idea',
17
+ },
18
+ payload: {
19
+ type: 'string',
20
+ description: 'Required for edit_text (new text) and add_tag (tag name). Ignored for other actions.',
21
+ },
22
+ },
23
+ required: ['id', 'action'],
24
+ },
25
+ handler: async (args) => {
26
+ const snapshot = getSnapshot();
27
+ if (!snapshot || snapshot.ideas.length === 0) {
28
+ return {
29
+ content: [{
30
+ type: 'text',
31
+ text: 'No ideas found. Make sure MCP Sync is enabled in IdeaBlast.',
32
+ }],
33
+ isError: true,
34
+ };
35
+ }
36
+ const id = args.id;
37
+ const action = args.action;
38
+ const payload = args.payload;
39
+ // Verify idea exists
40
+ const idea = snapshot.ideas.find(i => i.id === id);
41
+ if (!idea) {
42
+ return {
43
+ content: [{
44
+ type: 'text',
45
+ text: `Idea with ID "${id}" not found. Use read_ideas to see all ideas and their IDs.`,
46
+ }],
47
+ isError: true,
48
+ };
49
+ }
50
+ // Validate payload requirements
51
+ if (action === 'edit_text' && !payload) {
52
+ return {
53
+ content: [{
54
+ type: 'text',
55
+ text: 'Action "edit_text" requires a "payload" with the new text.',
56
+ }],
57
+ isError: true,
58
+ };
59
+ }
60
+ if (action === 'add_tag' && !payload) {
61
+ return {
62
+ content: [{
63
+ type: 'text',
64
+ text: 'Action "add_tag" requires a "payload" with the tag name.',
65
+ }],
66
+ isError: true,
67
+ };
68
+ }
69
+ // Queue the action
70
+ const actionItem = add({
71
+ action: action,
72
+ targetId: id,
73
+ payload,
74
+ });
75
+ const actionDescriptions = {
76
+ toggle_done: 'Mark as done/undone',
77
+ toggle_favorite: 'Mark as favorite/unfavorite',
78
+ edit_text: `Edit text to: "${payload}"`,
79
+ add_tag: `Add tag: "${payload}"`,
80
+ delete: 'Delete idea',
81
+ };
82
+ return {
83
+ content: [{
84
+ type: 'text',
85
+ text: `Action queued successfully!\n\nIdea: "${idea.text}"\nAction: ${actionDescriptions[action]}\nID: ${actionItem.id}\n\nThe change will apply when IdeaBlast syncs with the MCP server.`,
86
+ }],
87
+ };
88
+ },
89
+ };
90
+ //# sourceMappingURL=update-idea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-idea.js","sourceRoot":"","sources":["../../src/tools/update-idea.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const weeklySummary: ToolDefinition;
@@ -0,0 +1,83 @@
1
+ import { getSnapshot } from '../inbox.js';
2
+ export const weeklySummary = {
3
+ name: 'weekly_summary',
4
+ description: 'Generate a weekly review of your ideas and progress.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ focus: {
9
+ type: 'string',
10
+ enum: ['productivity', 'insights', 'highlights'],
11
+ description: 'Focus area: productivity (numbers), insights (analysis), or highlights (key achievements). Default: insights',
12
+ },
13
+ },
14
+ },
15
+ handler: async (args) => {
16
+ const snapshot = getSnapshot();
17
+ if (!snapshot || snapshot.ideas.length === 0) {
18
+ return {
19
+ content: [{
20
+ type: 'text',
21
+ text: 'No ideas found for weekly summary. Make sure MCP Sync is enabled in IdeaBlast.',
22
+ }],
23
+ };
24
+ }
25
+ const focus = args.focus || 'insights';
26
+ const ideas = snapshot.ideas;
27
+ // Calculate date ranges
28
+ const now = new Date();
29
+ const weekStart = new Date(now);
30
+ weekStart.setDate(now.getDate() - now.getDay());
31
+ weekStart.setHours(0, 0, 0, 0);
32
+ const lastWeekStart = new Date(weekStart);
33
+ lastWeekStart.setDate(weekStart.getDate() - 7);
34
+ // Filter ideas by time periods
35
+ const thisWeekIdeas = ideas.filter(i => new Date(i.createdAt) >= weekStart);
36
+ const lastWeekIdeas = ideas.filter(i => {
37
+ const date = new Date(i.createdAt);
38
+ return date >= lastWeekStart && date < weekStart;
39
+ });
40
+ const thisWeekDone = thisWeekIdeas.filter(i => i.isDone).length;
41
+ const lastWeekDone = lastWeekIdeas.filter(i => i.isDone).length;
42
+ // Overall stats
43
+ const total = ideas.length;
44
+ const totalDone = ideas.filter(i => i.isDone).length;
45
+ const totalFavorites = ideas.filter(i => i.isFavorite).length;
46
+ const active = ideas.filter(i => !i.isDone).length;
47
+ // Overdue items
48
+ const overdue = ideas.filter(i => i.deadline && !i.isDone && new Date(i.deadline) < now).length;
49
+ const completionRate = total > 0 ? Math.round((totalDone / total) * 100) : 0;
50
+ let summary = `📊 **Weekly Summary** (${weekStart.toLocaleDateString()} - ${now.toLocaleDateString()})\n\n` +
51
+ `**This Week**\n` +
52
+ `- Ideas created: ${thisWeekIdeas.length}\n` +
53
+ `- Ideas completed: ${thisWeekDone}\n` +
54
+ `- Completion rate: ${thisWeekIdeas.length > 0 ? Math.round((thisWeekDone / thisWeekIdeas.length) * 100) : 0}%\n\n` +
55
+ `**Overall Stats**\n` +
56
+ `- Total ideas: ${total}\n` +
57
+ `- Total completed: ${totalDone} (${completionRate}%)\n` +
58
+ `- Active ideas: ${active}\n` +
59
+ `- Favorites: ${totalFavorites}\n` +
60
+ `- Overdue: ${overdue}\n\n` +
61
+ `**Insights**\n`;
62
+ if (completionRate >= 70) {
63
+ summary += '- 🔥 Excellent completion rate! Keep it up!\n';
64
+ }
65
+ else if (completionRate >= 50) {
66
+ summary += '- 👍 Good progress. Try to complete more active ideas.\n';
67
+ }
68
+ else {
69
+ summary += '- 💡 Consider focusing on completing existing ideas.\n';
70
+ }
71
+ if (overdue > 0) {
72
+ summary += `- ⚠️ You have ${overdue} overdue items. Consider reviewing and rescheduling.\n`;
73
+ }
74
+ summary += `\n*Last synced: ${snapshot.updatedAt}*`;
75
+ return {
76
+ content: [{
77
+ type: 'text',
78
+ text: summary,
79
+ }],
80
+ };
81
+ },
82
+ };
83
+ //# sourceMappingURL=weekly-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weekly-summary.js","sourceRoot":"","sources":["../../src/tools/weekly-summary.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -25,3 +25,14 @@ export interface SnapshotData {
25
25
  ideas: IdeaSnapshot[];
26
26
  updatedAt: string;
27
27
  }
28
+ export interface ActionItem {
29
+ id: string;
30
+ action: 'toggle_done' | 'toggle_favorite' | 'edit_text' | 'add_tag' | 'delete';
31
+ targetId: string;
32
+ payload?: string;
33
+ createdAt: string;
34
+ }
35
+ export interface ActionData {
36
+ items: ActionItem[];
37
+ lastModified: string;
38
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ideablast-mcp-server",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "MCP server for IdeaBlast - Create ideas from Claude Desktop",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",