@intangle/mcp-server 2.6.6 → 2.6.8

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
@@ -1,23 +1,23 @@
1
1
  # @intangle/mcp-server
2
2
 
3
- Model Context Protocol server for [Intangle](https://intangle.app) - Intelligent AI context that persists across conversations.
3
+ Model Context Protocol server for [Intangle](https://renvoi.co/intangle) - Intelligent AI context that persists across conversations.
4
4
 
5
5
  ## What is Intangle?
6
6
 
7
7
  Intangle is an AI context system that gives Claude and other AI assistants persistent, searchable context across all your conversations and isolated spaces. Unlike traditional chat interfaces where context is lost between sessions, Intangle maintains your personal context across isolated spaces, with intelligent storing and retrieval.
8
8
 
9
- **Important: You need an Intangle account to use this MCP server. Sign up at [intangle.app](https://intangle.app)**
9
+ **Important: You need an Intangle account to use this MCP server. Sign up at [renvoi.co/intangle](https://renvoi.co/intangle)**
10
10
 
11
11
  ## Setup
12
12
 
13
- 1. **Create an Intangle account** at [intangle.app](https://intangle.app) and get your API key from Settings → Connect
13
+ 1. **Create an Intangle account** at [renvoi.co/intangle](https://renvoi.co/intangle) and get your API key from Settings → Connect
14
14
 
15
15
  2. **Configure Provider Access **
16
16
 
17
17
  Claude code by running the command below (recommend "-s" user for global across projects):
18
18
 
19
19
  ```bash
20
- claude mcp add intangle -s user --env MCP_API_KEY=<your-api-key-here> --env NEXT_APP_URL=https://app.intangle.app -- npx -y @intangle/mcp-server
20
+ claude mcp add intangle -s user --env MCP_API_KEY=<your-api-key-here> --env NEXT_APP_URL=https://renvoi.co/intangle -- npx -y @intangle/mcp-server
21
21
  ```
22
22
 
23
23
  If your deployment is behind Vercel Deployment Protection (for example staging), add:
@@ -36,7 +36,7 @@ Standard MCP (Claude desktop, Cursor): by adding to your `claude_desktop_config.
36
36
  "args": ["@intangle/mcp-server"],
37
37
  "env": {
38
38
  "MCP_API_KEY": "your-api-key-here",
39
- "NEXT_APP_URL": "https://app.intangle.app",
39
+ "NEXT_APP_URL": "https://renvoi.co/intangle",
40
40
  "VERCEL_BYPASS_TOKEN": "optional-vercel-bypass-token-for-protected-deployments"
41
41
  }
42
42
  }
@@ -92,7 +92,7 @@ If Claude can't access your context:
92
92
 
93
93
  ## Support
94
94
 
95
- - Website: [intangle.app](https://intangle.app)
95
+ - Website: [renvoi.co/intangle](https://renvoi.co/intangle)
96
96
  - Issues: [github.com/intangle/mcp-server/issues](https://github.com/intangle/mcp-server/issues)
97
97
  - Email: hello@intangle.app
98
98
 
package/dist/index.js CHANGED
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * Intangle MCP Server - Exposes Intangle context functionality through MCP
4
4
  */
5
- import { readFileSync } from "fs";
6
- import { dirname, join } from "path";
7
- import { fileURLToPath } from "url";
5
+ import { appendFileSync, readFileSync } from "node:fs";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
8
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
9
9
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
10
  import { CallToolRequestSchema, ErrorCode, ListResourceTemplatesRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, McpError, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
@@ -13,7 +13,6 @@ import fetch from "node-fetch";
13
13
  import { TOOLS } from "./tool-definitions.js";
14
14
  // ... imports ...
15
15
  // Debug logging
16
- import { appendFileSync } from "fs";
17
16
  const DEBUG_LOG = "/tmp/intangle-mcp-debug.log";
18
17
  function log(msg) {
19
18
  try {
@@ -30,7 +29,7 @@ try {
30
29
  config({ quiet: true });
31
30
  config({ path: ".env.local", quiet: true });
32
31
  // Base URL for API calls to Next.js app
33
- const API_BASE_URL = process.env.NEXT_APP_URL || "https://app.intangle.app";
32
+ const API_BASE_URL = process.env.NEXT_APP_URL || "https://renvoi.co/intangle";
34
33
  const MCP_API_KEY = process.env.MCP_API_KEY;
35
34
  const VERCEL_BYPASS_TOKEN = process.env.VERCEL_BYPASS_TOKEN || process.env.VERCEL_PROTECTION_BYPASS;
36
35
  log(`CWD: ${process.cwd()}`);
@@ -158,7 +157,7 @@ try {
158
157
  if (contentType.includes("text/html") ||
159
158
  /^\s*<!DOCTYPE\s+html/i.test(responseBody) ||
160
159
  /^\s*<html\b/i.test(responseBody)) {
161
- throw new Error(`API call to ${buildApiUrl(endpoint)} returned HTML instead of JSON. Check NEXT_APP_URL and point it at the app host, e.g. https://app.intangle.app.`);
160
+ throw new Error(`API call to ${buildApiUrl(endpoint)} returned HTML instead of JSON. Check NEXT_APP_URL and point it at the app host, e.g. https://renvoi.co/intangle.`);
162
161
  }
163
162
  return JSON.parse(responseBody);
164
163
  }
@@ -399,10 +398,6 @@ try {
399
398
  const { space_id } = args;
400
399
  return makeApiCall("view-space", args);
401
400
  }
402
- async function handleStart(args) {
403
- const { space_id } = args;
404
- return makeApiCall("start", args);
405
- }
406
401
  async function handleUpdateSpace(args) {
407
402
  if (!args.space_id) {
408
403
  throw new Error("space_id is required. Use view_spaces to see available options.");
@@ -529,8 +524,7 @@ try {
529
524
  result = await handleViewSpace(args);
530
525
  break;
531
526
  case "start":
532
- result = await handleStart(args);
533
- break;
527
+ throw new McpError(ErrorCode.InvalidRequest, "The start tool is disabled because its curated briefing can be stale or misleading. Use view_spaces, view_space, search, fetch_items, message, and update_memory instead.");
534
528
  case "update_memory":
535
529
  case "update_space":
536
530
  result = await handleUpdateSpace(args);
@@ -39,7 +39,7 @@ const TOOL_DEFINITIONS = [
39
39
  {
40
40
  name: "fetch_items",
41
41
  title: "Fetch Items by ID",
42
- description: "Retrieve full content for specific items by ID, including `artifact_*` and `summary_*` ids. Artifact fetches return content plus render metadata and `config`/`state`/`data` when available.",
42
+ description: "Retrieve full content for specific items by ID, including `file_*`, `artifact_*`, and `summary_*` ids. File fetches return extracted content, file metadata, chunk metadata, and decrypted `data.source_data_url` when available; use this before asking Tan to reason over a specific uploaded contract/file in detail. Artifact fetches return content plus render metadata and `config`/`state`/`data` when available.",
43
43
  inputSchema: {
44
44
  type: "object",
45
45
  properties: {
@@ -49,12 +49,12 @@ const TOOL_DEFINITIONS = [
49
49
  },
50
50
  id: {
51
51
  type: "string",
52
- description: "Single ID to fetch (e.g. `mem_123`, `task_456`, `skill_789`, `doc_321`, `artifact_654`, or `summary_987`)."
52
+ description: "Single ID to fetch (e.g. `mem_123`, `task_456`, `skill_789`, `doc_321`, `file_654`, `artifact_654`, or `summary_987`)."
53
53
  },
54
54
  ids: {
55
55
  type: "array",
56
56
  items: { type: "string" },
57
- description: "Array of IDs to fetch (mix of context, task, skill, document, artifact, insight, or conversation IDs). Use this to fetch multiple items in one call."
57
+ description: "Array of IDs to fetch (mix of context, task, skill, document, file, artifact, insight, or conversation IDs). Use this to fetch multiple items in one call."
58
58
  }
59
59
  }
60
60
  }
@@ -426,21 +426,6 @@ const TOOL_DEFINITIONS = [
426
426
  required: ["space_id", "project_id"]
427
427
  }
428
428
  },
429
- {
430
- name: "start",
431
- title: "Start Space Session",
432
- description: "Load a space fast for a new external caller. Returns assistant-curated current items, useful insights, skills, recent conversations, and assistant preferences so the caller can get oriented quickly and fetch deeper details only when needed. Use this before asking Tan to do work in that space.",
433
- inputSchema: {
434
- type: "object",
435
- properties: {
436
- space_id: {
437
- type: "string",
438
- description: "Space to start (e.g., 'renvoi', 'personal')"
439
- }
440
- },
441
- required: ["space_id"]
442
- }
443
- },
444
429
  {
445
430
  name: "view_spaces",
446
431
  title: "View Spaces",
@@ -468,11 +453,11 @@ const TOOL_DEFINITIONS = [
468
453
  config_badges: {
469
454
  type: "array",
470
455
  items: { type: "string" },
471
- description: "Array of keywords for start tool keywords in this NEW space. These keywords help steer what context gets loaded when running 'start' for this space. Examples: ['fitness', 'recipes', 'travel planning'], ['client work', 'meetings', 'proposals'], ['TypeScript', 'React', 'API design']. They act as search terms to prioritize relevant context."
456
+ description: "Array of keywords for this NEW space. Examples: ['fitness', 'recipes', 'travel planning'], ['client work', 'meetings', 'proposals'], ['TypeScript', 'React', 'API design']. They help agents understand and prioritize the space."
472
457
  },
473
458
  startup_preferences: {
474
459
  type: "string",
475
- description: "AI behavior preferences for this NEW space. Guides how AI assistants and agents should communicate and behave (e.g., 'be concise and frank', 'think critically', 'play devils advocate'). This appears in the start briefing under 'Assistant Preferences'."
460
+ description: "AI behavior preferences for this NEW space. Guides how AI assistants and agents should communicate and behave (e.g., 'be concise and frank', 'think critically', 'play devils advocate')."
476
461
  }
477
462
  },
478
463
  required: ["name"]
@@ -506,7 +491,7 @@ const TOOL_DEFINITIONS = [
506
491
  },
507
492
  project_id: {
508
493
  type: "string",
509
- description: "Optional: Project to add items to. All items created in this request will be linked to this project and appear on its canvas. Get project IDs from the start tool output."
494
+ description: "Optional: Project to add items to. All items created in this request will be linked to this project and appear on its canvas. Get project IDs from view_projects or search."
510
495
  },
511
496
  group_id: {
512
497
  type: "string",
@@ -676,7 +661,6 @@ const TOOL_DEFINITIONS = [
676
661
  "insights_user",
677
662
  "agents",
678
663
  "skills",
679
- "conversations",
680
664
  "dashboard"
681
665
  ],
682
666
  description: "Optional: filter folders by sidebar section."
@@ -699,7 +683,6 @@ const TOOL_DEFINITIONS = [
699
683
  "insights_user",
700
684
  "agents",
701
685
  "skills",
702
- "conversations",
703
686
  "dashboard"
704
687
  ],
705
688
  description: "Sidebar section this folder belongs to."
@@ -751,7 +734,7 @@ const TOOL_DEFINITIONS = [
751
734
  {
752
735
  name: "message",
753
736
  title: "Message Assistant",
754
- description: "Primary way to use Intangle for memory, communicating and collaborating with Tan agent in a shared thread. Send a request and either wait for one assistant turn to complete or submit asynchronously for later polling. External agents should include a stable participant_id, participant_type=`agent`, and participant_label so Tan can identify who is speaking and keep progress updates attached to the right caller. Returns assistant text plus continuity IDs (`session_id`, `conversation_id`) so callers can continue the same thread reliably across turns.",
737
+ description: "Primary way to use Intangle for memory, communicating and collaborating with Tan agent in a shared thread. Send a request and either wait for one assistant turn to complete or submit asynchronously for later polling. External agents should include a stable participant_id, participant_type=`agent`, and participant_label so Tan can identify who is speaking and keep progress updates attached to the right caller. Conversations are backed by `summary_*` IDs; reuse the returned `conversation_id` and reuse the returned `session_id` so callers can continue the same thread reliably across turns. For shared coordination channels, pass a stable `channel_id`; channel and project/group coordinates scope context, while the stable idempotency key anchors retries to one durable turn and the returned conversation_id remains the durable thread anchor.",
755
738
  inputSchema: {
756
739
  type: "object",
757
740
  properties: {
@@ -773,27 +756,44 @@ const TOOL_DEFINITIONS = [
773
756
  },
774
757
  new_conversation: {
775
758
  type: "boolean",
776
- description: "Optional. When true, force a fresh conversation instead of reusing the current active thread."
759
+ description: "Optional escape hatch. When true, force a fresh conversation instead of reusing the current active thread."
777
760
  },
778
761
  session_id: {
779
762
  type: "string",
780
- description: "Optional runtime session ID to reuse across calls. Reuse the returned session_id for best continuity and lower warm-up overhead."
763
+ description: "Optional runtime session ID to reuse across calls. For follow-up turns, reuse the exact session_id returned by the previous call for best continuity and lower warm-up overhead."
781
764
  },
782
765
  project_id: {
783
766
  type: "string",
784
767
  description: "Optional project scope for the assistant turn."
785
768
  },
769
+ group_id: {
770
+ type: "string",
771
+ description: "Optional group scope for the assistant turn. Use this with channel_id for group-scoped coordination."
772
+ },
773
+ channel_id: {
774
+ type: "string",
775
+ description: "Optional route/channel scope for the assistant turn. Defaults to root when omitted. Examples: root, group|legal, project|work/launch."
776
+ },
786
777
  organization_id: {
787
778
  type: "string",
788
779
  description: "Optional Clerk org ID when the space belongs to an organization graph."
789
780
  },
790
781
  timeout_ms: {
791
782
  type: "integer",
792
- description: "Optional timeout in milliseconds (10,000 to 300,000; default 120,000)."
783
+ description: "Optional bounded synchronous wait in milliseconds (10,000 to 45,000; default 45,000 when wait_for_response is true)."
793
784
  },
794
785
  wait_for_response: {
795
786
  type: "boolean",
796
- description: "Optional. Defaults to true. Set false to submit the turn asynchronously when you want a quick acknowledgement first and then poll later with list_conversation_inbox or fetch_conversation_messages."
787
+ description: "Optional. Defaults to false so the request returns a durable acknowledgement before infrastructure timeouts. Set true only for a bounded wait; a still-running turn returns status continuing and remains pollable."
788
+ },
789
+ client_turn_id: {
790
+ type: "string",
791
+ description: "Optional caller correlation value. Phoenix derives the durable turn identity from idempotency_key and scopes it by the verified user, graph, space, channel, project/group, and stable retry key."
792
+ },
793
+ idempotency_key: {
794
+ type: "string",
795
+ pattern: "\\S",
796
+ description: "REQUIRED stable retry key for this logical message within its room. Reuse it exactly on retry; Phoenix atomically claims one dispatch and replays the original session_id, real conversation_id, and durable result state."
797
797
  },
798
798
  participant_id: {
799
799
  type: "string",
@@ -812,7 +812,7 @@ const TOOL_DEFINITIONS = [
812
812
  description: "Optional IANA timezone for assistant context."
813
813
  }
814
814
  },
815
- required: ["space_id", "content"]
815
+ required: ["space_id", "content", "idempotency_key"]
816
816
  }
817
817
  }
818
818
  // DISABLED: memory_action tool is broken and causing errors.
@@ -846,7 +846,6 @@ const READ_ONLY_TOOLS = new Set([
846
846
  "usage_status",
847
847
  "fetch_conversation_messages",
848
848
  "list_conversation_inbox",
849
- "start",
850
849
  "view_spaces",
851
850
  "view_space"
852
851
  ]);
@@ -862,7 +861,6 @@ const IDEMPOTENT_TOOLS = new Set([
862
861
  "usage_status",
863
862
  "fetch_conversation_messages",
864
863
  "list_conversation_inbox",
865
- "start",
866
864
  "view_spaces",
867
865
  "view_space"
868
866
  ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intangle/mcp-server",
3
- "version": "2.6.6",
3
+ "version": "2.6.8",
4
4
  "description": "Model Context Protocol server for Intangle - AI context that persists across conversations",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -10,12 +10,17 @@
10
10
  "prebuild": "cp ../web/src/app/api/mcp-remote/tool-definitions.ts ./tool-definitions.ts",
11
11
  "build": "tsc",
12
12
  "lint": "biome check .",
13
+ "lint:release": "biome check --config-path=biome.release.json package.json index.ts tool-definitions.ts",
13
14
  "lint:fix": "biome check --fix .",
14
15
  "prepublishOnly": "npm run build"
15
16
  },
16
17
  "bin": {
17
18
  "intangle-mcp": "dist/index.js"
18
19
  },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
19
24
  "keywords": [
20
25
  "mcp",
21
26
  "model-context-protocol",
@@ -34,7 +39,7 @@
34
39
  "type": "git",
35
40
  "url": "git+https://github.com/intangle/mcp-server.git"
36
41
  },
37
- "homepage": "https://intangle.app",
42
+ "homepage": "https://renvoi.co/intangle",
38
43
  "engines": {
39
44
  "node": ">=18.0.0"
40
45
  },
@@ -49,5 +54,6 @@
49
54
  "@types/node-fetch": "^2.6.12",
50
55
  "tsx": "^4.0.0",
51
56
  "typescript": "^5.0.0"
52
- }
57
+ },
58
+ "intangleSourceHash": "8ab73509fba985fb9fa892428eb8149a981d2b044505f85a01a05f054c788c92"
53
59
  }
package/.env.local DELETED
@@ -1,3 +0,0 @@
1
- MCP_API_KEY=mcp_placeholder_key_will_be_replaced_by_user_specific_key
2
- NEXT_APP_URL=https://intangle.app
3
- VERCEL_BYPASS_TOKEN=igXBygPO1T5dWLBaVyQiN9QB7IECZ50O
package/biome.json DELETED
@@ -1,39 +0,0 @@
1
- {
2
- "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3
- "vcs": {
4
- "enabled": false,
5
- "clientKind": "git",
6
- "useIgnoreFile": false
7
- },
8
- "files": {
9
- "ignoreUnknown": false
10
- },
11
- "formatter": {
12
- "enabled": true,
13
- "formatWithErrors": false,
14
- "indentStyle": "space",
15
- "indentWidth": 2,
16
- "lineEnding": "lf",
17
- "lineWidth": 80,
18
- "attributePosition": "auto"
19
- },
20
- "linter": {
21
- "enabled": true,
22
- "rules": {
23
- "recommended": true
24
- }
25
- },
26
- "javascript": {
27
- "formatter": {
28
- "jsxQuoteStyle": "double",
29
- "quoteProperties": "asNeeded",
30
- "trailingCommas": "es5",
31
- "semicolons": "asNeeded",
32
- "arrowParentheses": "always",
33
- "bracketSpacing": true,
34
- "bracketSameLine": false,
35
- "quoteStyle": "double",
36
- "attributePosition": "auto"
37
- }
38
- }
39
- }