@intangle/mcp-server 1.1.0 → 1.1.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.
Files changed (3) hide show
  1. package/dist/index.js +199 -3
  2. package/index.ts +211 -3
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ import fetch from "node-fetch";
7
7
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
8
8
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
9
  import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from "@modelcontextprotocol/sdk/types.js";
10
+ import { readFileSync } from 'fs';
11
+ import { fileURLToPath } from 'url';
12
+ import { dirname, join } from 'path';
10
13
  // Load environment variables from .env and .env.local
11
14
  config({ quiet: true });
12
15
  config({ path: ".env.local", quiet: true });
@@ -20,9 +23,10 @@ if (!MCP_API_KEY) {
20
23
  process.exit(1);
21
24
  }
22
25
  console.log("Intangle MCP Server starting - connecting to", API_BASE_URL);
23
- // Version checking
24
- // IMPORTANT: Update BOTH package.json version AND this constant when bumping version
25
- const CURRENT_VERSION = "1.1.0";
26
+ // Version checking - automatically read from package.json
27
+ const __dirname = dirname(fileURLToPath(import.meta.url));
28
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
29
+ const CURRENT_VERSION = packageJson.version;
26
30
  let latestVersion = null;
27
31
  let versionCheckDone = false;
28
32
  async function checkVersion() {
@@ -185,6 +189,24 @@ const TOOLS = [
185
189
  required: ["space_id"],
186
190
  },
187
191
  },
192
+ {
193
+ name: "fetch",
194
+ description: "Fetch complete items (context or tasks) by ID. Accepts single ID or array of IDs. Returns BOTH context (Memory nodes) and tasks (Task nodes) with full content, topics, and metadata. Always returns full content (never summaries). Use this after getting summaries from search/list/start to retrieve full details for specific items.",
195
+ inputSchema: {
196
+ type: "object",
197
+ properties: {
198
+ id: {
199
+ type: "string",
200
+ description: "Single ID to fetch (context or task ID like 'mem_123' or 'task_456')",
201
+ },
202
+ ids: {
203
+ type: "array",
204
+ items: { type: "string" },
205
+ description: "Array of IDs to fetch (mix of context and task IDs). Use this to fetch multiple items in one call.",
206
+ },
207
+ },
208
+ },
209
+ },
188
210
  {
189
211
  name: "get_entities",
190
212
  description: "Get extracted entities (people, places, concepts) from CONTEXT items (general information). If no memory_id provided, returns top 20 most frequently mentioned entities across all context. WARNING: This tool can return large responses - use sparingly and only when entity information is specifically needed.",
@@ -451,6 +473,156 @@ const TOOLS = [
451
473
  required: ["space_id", "tasks"],
452
474
  },
453
475
  },
476
+ {
477
+ name: "update_memory",
478
+ description: "Update memory with new CONTEXT and TASKS. Unified tool for adding new items to the memory system in one call. NOTE: 'Memories' encompasses both context (general information, stored as Memory nodes) and tasks (actionable items, stored as Task nodes). This tool is for ADDING new items to update the memory system, not modifying existing ones. At least one of context or tasks must be provided. REQUIRES space_id parameter.",
479
+ inputSchema: {
480
+ type: "object",
481
+ properties: {
482
+ space_id: {
483
+ type: "string",
484
+ description: "REQUIRED: Space to add items to (use list_spaces to see available options)",
485
+ },
486
+ context: {
487
+ oneOf: [
488
+ {
489
+ type: "object",
490
+ properties: {
491
+ title: {
492
+ type: "string",
493
+ description: "Context item title",
494
+ },
495
+ content: {
496
+ type: "string",
497
+ description: "Context item content (general information/knowledge)",
498
+ },
499
+ topics: {
500
+ type: "array",
501
+ items: { type: "string" },
502
+ description: "Optional topics/tags for organization",
503
+ },
504
+ source: {
505
+ type: "string",
506
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
507
+ description: "Optional source indicator",
508
+ },
509
+ },
510
+ required: ["title", "content"],
511
+ },
512
+ {
513
+ type: "array",
514
+ items: {
515
+ type: "object",
516
+ properties: {
517
+ title: {
518
+ type: "string",
519
+ description: "Context item title",
520
+ },
521
+ content: {
522
+ type: "string",
523
+ description: "Context item content (general information/knowledge)",
524
+ },
525
+ topics: {
526
+ type: "array",
527
+ items: { type: "string" },
528
+ description: "Optional topics/tags for organization",
529
+ },
530
+ source: {
531
+ type: "string",
532
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
533
+ description: "Optional source indicator",
534
+ },
535
+ },
536
+ required: ["title", "content"],
537
+ },
538
+ },
539
+ ],
540
+ description: "Optional context items to add (general information/knowledge)",
541
+ },
542
+ tasks: {
543
+ oneOf: [
544
+ {
545
+ type: "object",
546
+ properties: {
547
+ title: {
548
+ type: "string",
549
+ description: "Task title/summary",
550
+ },
551
+ content: {
552
+ type: "string",
553
+ description: "Detailed task description",
554
+ },
555
+ topics: {
556
+ type: "array",
557
+ items: { type: "string" },
558
+ description: "Optional topics/tags for organization",
559
+ },
560
+ status: {
561
+ type: "string",
562
+ enum: ["pending", "in_progress", "completed", "invalidated"],
563
+ description: "Task status (default: pending)",
564
+ default: "pending",
565
+ },
566
+ priority: {
567
+ type: "string",
568
+ enum: ["urgent", "high", "medium", "low"],
569
+ description: "Task priority level (default: medium)",
570
+ default: "medium",
571
+ },
572
+ source: {
573
+ type: "string",
574
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
575
+ description: "Optional source indicator",
576
+ },
577
+ },
578
+ required: ["title", "content"],
579
+ },
580
+ {
581
+ type: "array",
582
+ items: {
583
+ type: "object",
584
+ properties: {
585
+ title: {
586
+ type: "string",
587
+ description: "Task title/summary",
588
+ },
589
+ content: {
590
+ type: "string",
591
+ description: "Detailed task description",
592
+ },
593
+ topics: {
594
+ type: "array",
595
+ items: { type: "string" },
596
+ description: "Optional topics/tags for organization",
597
+ },
598
+ status: {
599
+ type: "string",
600
+ enum: ["pending", "in_progress", "completed", "invalidated"],
601
+ description: "Task status (default: pending)",
602
+ default: "pending",
603
+ },
604
+ priority: {
605
+ type: "string",
606
+ enum: ["urgent", "high", "medium", "low"],
607
+ description: "Task priority level (default: medium)",
608
+ default: "medium",
609
+ },
610
+ source: {
611
+ type: "string",
612
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
613
+ description: "Optional source indicator",
614
+ },
615
+ },
616
+ required: ["title", "content"],
617
+ },
618
+ },
619
+ ],
620
+ description: "Optional tasks to add (actionable workflow items)",
621
+ },
622
+ },
623
+ required: ["space_id"],
624
+ },
625
+ },
454
626
  {
455
627
  name: "update_task_status",
456
628
  description: "Change a task's status (pending/in_progress/completed/invalidated)",
@@ -631,6 +803,10 @@ async function handleGetRecentMemories(args) {
631
803
  limit,
632
804
  });
633
805
  }
806
+ async function handleFetch(args) {
807
+ const { id, ids } = args;
808
+ return makeApiCall("fetch", { id, ids });
809
+ }
634
810
  async function handleGetEntities(args) {
635
811
  const { memory_id } = args;
636
812
  return makeApiCall("get-entities", { memory_id });
@@ -666,6 +842,20 @@ async function handleAddTask(args) {
666
842
  tasks: args.tasks,
667
843
  });
668
844
  }
845
+ async function handleUpdateMemory(args) {
846
+ if (!args.space_id) {
847
+ throw new Error("space_id is required. Use list_spaces to see available options.");
848
+ }
849
+ if (!args.context && !args.tasks) {
850
+ throw new Error("At least one of context or tasks must be provided");
851
+ }
852
+ // Pass through to API
853
+ return makeApiCall("update-memory", {
854
+ space_id: args.space_id,
855
+ context: args.context,
856
+ tasks: args.tasks,
857
+ });
858
+ }
669
859
  async function handleUpdateTaskStatus(args) {
670
860
  return makeApiCall("update-task-status", args);
671
861
  }
@@ -699,6 +889,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
699
889
  case "get_recent_memories":
700
890
  result = await handleGetRecentMemories(args);
701
891
  break;
892
+ case "fetch":
893
+ result = await handleFetch(args);
894
+ break;
702
895
  case "get_entities":
703
896
  result = await handleGetEntities(args);
704
897
  break;
@@ -720,6 +913,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
720
913
  case "add_task":
721
914
  result = await handleAddTask(args);
722
915
  break;
916
+ case "update_memory":
917
+ result = await handleUpdateMemory(args);
918
+ break;
723
919
  case "update_task_status":
724
920
  result = await handleUpdateTaskStatus(args);
725
921
  break;
package/index.ts CHANGED
@@ -14,6 +14,9 @@ import {
14
14
  ListToolsRequestSchema,
15
15
  McpError,
16
16
  } from "@modelcontextprotocol/sdk/types.js";
17
+ import { readFileSync } from 'fs';
18
+ import { fileURLToPath } from 'url';
19
+ import { dirname, join } from 'path';
17
20
 
18
21
  // Load environment variables from .env and .env.local
19
22
  config({ quiet: true });
@@ -33,9 +36,10 @@ if (!MCP_API_KEY) {
33
36
 
34
37
  console.log("Intangle MCP Server starting - connecting to", API_BASE_URL);
35
38
 
36
- // Version checking
37
- // IMPORTANT: Update BOTH package.json version AND this constant when bumping version
38
- const CURRENT_VERSION = "1.1.0";
39
+ // Version checking - automatically read from package.json
40
+ const __dirname = dirname(fileURLToPath(import.meta.url));
41
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
42
+ const CURRENT_VERSION = packageJson.version;
39
43
  let latestVersion: string | null = null;
40
44
  let versionCheckDone = false;
41
45
 
@@ -217,6 +221,25 @@ const TOOLS = [
217
221
  required: ["space_id"],
218
222
  },
219
223
  },
224
+ {
225
+ name: "fetch",
226
+ description:
227
+ "Fetch complete items (context or tasks) by ID. Accepts single ID or array of IDs. Returns BOTH context (Memory nodes) and tasks (Task nodes) with full content, topics, and metadata. Always returns full content (never summaries). Use this after getting summaries from search/list/start to retrieve full details for specific items.",
228
+ inputSchema: {
229
+ type: "object",
230
+ properties: {
231
+ id: {
232
+ type: "string",
233
+ description: "Single ID to fetch (context or task ID like 'mem_123' or 'task_456')",
234
+ },
235
+ ids: {
236
+ type: "array",
237
+ items: { type: "string" },
238
+ description: "Array of IDs to fetch (mix of context and task IDs). Use this to fetch multiple items in one call.",
239
+ },
240
+ },
241
+ },
242
+ },
220
243
  {
221
244
  name: "get_entities",
222
245
  description:
@@ -491,6 +514,158 @@ const TOOLS = [
491
514
  required: ["space_id", "tasks"],
492
515
  },
493
516
  },
517
+ {
518
+ name: "update_memory",
519
+ description:
520
+ "Update memory with new CONTEXT and TASKS. Unified tool for adding new items to the memory system in one call. NOTE: 'Memories' encompasses both context (general information, stored as Memory nodes) and tasks (actionable items, stored as Task nodes). This tool is for ADDING new items to update the memory system, not modifying existing ones. At least one of context or tasks must be provided. REQUIRES space_id parameter.",
521
+ inputSchema: {
522
+ type: "object",
523
+ properties: {
524
+ space_id: {
525
+ type: "string",
526
+ description:
527
+ "REQUIRED: Space to add items to (use list_spaces to see available options)",
528
+ },
529
+ context: {
530
+ oneOf: [
531
+ {
532
+ type: "object",
533
+ properties: {
534
+ title: {
535
+ type: "string",
536
+ description: "Context item title",
537
+ },
538
+ content: {
539
+ type: "string",
540
+ description: "Context item content (general information/knowledge)",
541
+ },
542
+ topics: {
543
+ type: "array",
544
+ items: { type: "string" },
545
+ description: "Optional topics/tags for organization",
546
+ },
547
+ source: {
548
+ type: "string",
549
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
550
+ description: "Optional source indicator",
551
+ },
552
+ },
553
+ required: ["title", "content"],
554
+ },
555
+ {
556
+ type: "array",
557
+ items: {
558
+ type: "object",
559
+ properties: {
560
+ title: {
561
+ type: "string",
562
+ description: "Context item title",
563
+ },
564
+ content: {
565
+ type: "string",
566
+ description: "Context item content (general information/knowledge)",
567
+ },
568
+ topics: {
569
+ type: "array",
570
+ items: { type: "string" },
571
+ description: "Optional topics/tags for organization",
572
+ },
573
+ source: {
574
+ type: "string",
575
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
576
+ description: "Optional source indicator",
577
+ },
578
+ },
579
+ required: ["title", "content"],
580
+ },
581
+ },
582
+ ],
583
+ description: "Optional context items to add (general information/knowledge)",
584
+ },
585
+ tasks: {
586
+ oneOf: [
587
+ {
588
+ type: "object",
589
+ properties: {
590
+ title: {
591
+ type: "string",
592
+ description: "Task title/summary",
593
+ },
594
+ content: {
595
+ type: "string",
596
+ description: "Detailed task description",
597
+ },
598
+ topics: {
599
+ type: "array",
600
+ items: { type: "string" },
601
+ description: "Optional topics/tags for organization",
602
+ },
603
+ status: {
604
+ type: "string",
605
+ enum: ["pending", "in_progress", "completed", "invalidated"],
606
+ description: "Task status (default: pending)",
607
+ default: "pending",
608
+ },
609
+ priority: {
610
+ type: "string",
611
+ enum: ["urgent", "high", "medium", "low"],
612
+ description: "Task priority level (default: medium)",
613
+ default: "medium",
614
+ },
615
+ source: {
616
+ type: "string",
617
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
618
+ description: "Optional source indicator",
619
+ },
620
+ },
621
+ required: ["title", "content"],
622
+ },
623
+ {
624
+ type: "array",
625
+ items: {
626
+ type: "object",
627
+ properties: {
628
+ title: {
629
+ type: "string",
630
+ description: "Task title/summary",
631
+ },
632
+ content: {
633
+ type: "string",
634
+ description: "Detailed task description",
635
+ },
636
+ topics: {
637
+ type: "array",
638
+ items: { type: "string" },
639
+ description: "Optional topics/tags for organization",
640
+ },
641
+ status: {
642
+ type: "string",
643
+ enum: ["pending", "in_progress", "completed", "invalidated"],
644
+ description: "Task status (default: pending)",
645
+ default: "pending",
646
+ },
647
+ priority: {
648
+ type: "string",
649
+ enum: ["urgent", "high", "medium", "low"],
650
+ description: "Task priority level (default: medium)",
651
+ default: "medium",
652
+ },
653
+ source: {
654
+ type: "string",
655
+ enum: ["chatgpt", "claude-app", "claude-code", "intangle"],
656
+ description: "Optional source indicator",
657
+ },
658
+ },
659
+ required: ["title", "content"],
660
+ },
661
+ },
662
+ ],
663
+ description: "Optional tasks to add (actionable workflow items)",
664
+ },
665
+ },
666
+ required: ["space_id"],
667
+ },
668
+ },
494
669
  {
495
670
  name: "update_task_status",
496
671
  description: "Change a task's status (pending/in_progress/completed/invalidated)",
@@ -706,6 +881,12 @@ async function handleGetRecentMemories(args: any) {
706
881
  });
707
882
  }
708
883
 
884
+ async function handleFetch(args: any) {
885
+ const { id, ids } = args as { id?: string; ids?: string[] };
886
+
887
+ return makeApiCall("fetch", { id, ids });
888
+ }
889
+
709
890
  async function handleGetEntities(args: any) {
710
891
  const { memory_id } = args as { memory_id?: string };
711
892
 
@@ -756,6 +937,27 @@ async function handleAddTask(args: any) {
756
937
  });
757
938
  }
758
939
 
940
+ async function handleUpdateMemory(args: any) {
941
+ if (!args.space_id) {
942
+ throw new Error(
943
+ "space_id is required. Use list_spaces to see available options.",
944
+ );
945
+ }
946
+
947
+ if (!args.context && !args.tasks) {
948
+ throw new Error(
949
+ "At least one of context or tasks must be provided",
950
+ );
951
+ }
952
+
953
+ // Pass through to API
954
+ return makeApiCall("update-memory", {
955
+ space_id: args.space_id,
956
+ context: args.context,
957
+ tasks: args.tasks,
958
+ });
959
+ }
960
+
759
961
  async function handleUpdateTaskStatus(args: any) {
760
962
  return makeApiCall("update-task-status", args);
761
963
  }
@@ -799,6 +1001,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request: any) => {
799
1001
  case "get_recent_memories":
800
1002
  result = await handleGetRecentMemories(args);
801
1003
  break;
1004
+ case "fetch":
1005
+ result = await handleFetch(args);
1006
+ break;
802
1007
  case "get_entities":
803
1008
  result = await handleGetEntities(args);
804
1009
  break;
@@ -820,6 +1025,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request: any) => {
820
1025
  case "add_task":
821
1026
  result = await handleAddTask(args);
822
1027
  break;
1028
+ case "update_memory":
1029
+ result = await handleUpdateMemory(args);
1030
+ break;
823
1031
  case "update_task_status":
824
1032
  result = await handleUpdateTaskStatus(args);
825
1033
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intangle/mcp-server",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Model Context Protocol server for Intangle - AI memory that persists across conversations",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",