@intangle/mcp-server 2.6.5 → 2.6.7

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/.env.local CHANGED
@@ -1,3 +1,4 @@
1
- MCP_API_KEY=mcp_placeholder_key_will_be_replaced_by_user_specific_key
1
+ MCP_API_KEY=mcp_user_30H8yYW7mghw0Zb8aQLhT4AsyRq_9f26b9e53ea30765ee25d9745b670afb
2
2
  NEXT_APP_URL=https://intangle.app
3
3
  VERCEL_BYPASS_TOKEN=igXBygPO1T5dWLBaVyQiN9QB7IECZ50O
4
+ INTANGLE_REMOTE_MCP_TOKEN=mcp_user_30H8yYW7mghw0Zb8aQLhT4AsyRq_9f26b9e53ea30765ee25d9745b670afb
package/README.md CHANGED
@@ -17,7 +17,7 @@ Intangle is an AI context system that gives Claude and other AI assistants persi
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
  }
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ try {
30
30
  config({ quiet: true });
31
31
  config({ path: ".env.local", quiet: true });
32
32
  // Base URL for API calls to Next.js app
33
- const API_BASE_URL = process.env.NEXT_APP_URL || "https://app.intangle.app";
33
+ const API_BASE_URL = process.env.NEXT_APP_URL || "https://renvoi.co/intangle";
34
34
  const MCP_API_KEY = process.env.MCP_API_KEY;
35
35
  const VERCEL_BYPASS_TOKEN = process.env.VERCEL_BYPASS_TOKEN || process.env.VERCEL_PROTECTION_BYPASS;
36
36
  log(`CWD: ${process.cwd()}`);
@@ -158,7 +158,7 @@ try {
158
158
  if (contentType.includes("text/html") ||
159
159
  /^\s*<!DOCTYPE\s+html/i.test(responseBody) ||
160
160
  /^\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.`);
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://renvoi.co/intangle.`);
162
162
  }
163
163
  return JSON.parse(responseBody);
164
164
  }
@@ -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. Accepts single ID or array of IDs.",
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,16 +49,17 @@ const TOOL_DEFINITIONS = [
49
49
  },
50
50
  id: {
51
51
  type: "string",
52
- description: "Single ID to fetch (context or task ID like 'mem_123' or 'task_456' or 'skill_789')"
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, and skill 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
  }
61
61
  },
62
+ { name: "read_artifact", title: "Read Artifact", description: "Read one existing artifact by `artifact_id` without asking Tan to restream it in chat. Returns content plus render metadata and `config`/`state`/`data` when available. Prefer this when an external agent already has the artifact id and needs the current artifact payload directly.", inputSchema: { type: "object", properties: { space_id: { type: "string", description: "Optional: Space containing the artifact. Provide this for shared/org spaces so access checks resolve against the correct graph." }, artifact_id: { type: "string", description: "REQUIRED: Existing artifact ID to read (e.g. `artifact_123`)." }, item_id: { type: "string", description: "Optional alias for `artifact_id`." }, organization_id: { type: "string", description: "Optional Clerk org ID when the space belongs to an organization graph." } }, required: ["artifact_id"] } },
62
63
  {
63
64
  name: "usage_status",
64
65
  title: "Usage Status",
@@ -750,7 +751,7 @@ const TOOL_DEFINITIONS = [
750
751
  {
751
752
  name: "message",
752
753
  title: "Message Assistant",
753
- 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.",
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. 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` and keep reusing the same `conversation_id`; `channel_id` scopes context, while `conversation_id` is the durable thread anchor.",
754
755
  inputSchema: {
755
756
  type: "object",
756
757
  properties: {
@@ -772,16 +773,24 @@ const TOOL_DEFINITIONS = [
772
773
  },
773
774
  new_conversation: {
774
775
  type: "boolean",
775
- description: "Optional. When true, force a fresh conversation instead of reusing the current active thread."
776
+ description: "Optional escape hatch. When true, force a fresh conversation instead of reusing the current active thread."
776
777
  },
777
778
  session_id: {
778
779
  type: "string",
779
- description: "Optional runtime session ID to reuse across calls. Reuse the returned session_id for best continuity and lower warm-up overhead."
780
+ 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."
780
781
  },
781
782
  project_id: {
782
783
  type: "string",
783
784
  description: "Optional project scope for the assistant turn."
784
785
  },
786
+ group_id: {
787
+ type: "string",
788
+ description: "Optional group scope for the assistant turn. Use this with channel_id for group-scoped coordination."
789
+ },
790
+ channel_id: {
791
+ type: "string",
792
+ description: "Optional route/channel scope for the assistant turn. Defaults to root when omitted. Examples: root, group|legal, project|work/launch."
793
+ },
785
794
  organization_id: {
786
795
  type: "string",
787
796
  description: "Optional Clerk org ID when the space belongs to an organization graph."
@@ -841,6 +850,7 @@ const TOOL_DEFINITIONS = [
841
850
  const READ_ONLY_TOOLS = new Set([
842
851
  "search",
843
852
  "fetch_items",
853
+ "read_artifact",
844
854
  "usage_status",
845
855
  "fetch_conversation_messages",
846
856
  "list_conversation_inbox",
@@ -856,6 +866,7 @@ const DESTRUCTIVE_TOOLS = new Set([
856
866
  const IDEMPOTENT_TOOLS = new Set([
857
867
  "search",
858
868
  "fetch_items",
869
+ "read_artifact",
859
870
  "usage_status",
860
871
  "fetch_conversation_messages",
861
872
  "list_conversation_inbox",
package/index.ts CHANGED
@@ -45,7 +45,7 @@ try {
45
45
  config({ path: ".env.local", quiet: true })
46
46
 
47
47
  // Base URL for API calls to Next.js app
48
- const API_BASE_URL = process.env.NEXT_APP_URL || "https://app.intangle.app"
48
+ const API_BASE_URL = process.env.NEXT_APP_URL || "https://renvoi.co/intangle"
49
49
  const MCP_API_KEY = process.env.MCP_API_KEY
50
50
  const VERCEL_BYPASS_TOKEN =
51
51
  process.env.VERCEL_BYPASS_TOKEN || process.env.VERCEL_PROTECTION_BYPASS
@@ -215,7 +215,7 @@ try {
215
215
  /^\s*<html\b/i.test(responseBody)
216
216
  ) {
217
217
  throw new Error(
218
- `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.`
218
+ `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.`
219
219
  )
220
220
  }
221
221
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intangle/mcp-server",
3
- "version": "2.6.5",
3
+ "version": "2.6.7",
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",
@@ -46,7 +46,7 @@ const TOOL_DEFINITIONS = [
46
46
  name: "fetch_items",
47
47
  title: "Fetch Items by ID",
48
48
  description:
49
- "Retrieve full content for specific items by ID. Accepts single ID or array of IDs.",
49
+ "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.",
50
50
  inputSchema: {
51
51
  type: "object",
52
52
  properties: {
@@ -58,17 +58,18 @@ const TOOL_DEFINITIONS = [
58
58
  id: {
59
59
  type: "string",
60
60
  description:
61
- "Single ID to fetch (context or task ID like 'mem_123' or 'task_456' or 'skill_789')"
61
+ "Single ID to fetch (e.g. `mem_123`, `task_456`, `skill_789`, `doc_321`, `file_654`, `artifact_654`, or `summary_987`)."
62
62
  },
63
63
  ids: {
64
64
  type: "array",
65
65
  items: { type: "string" },
66
66
  description:
67
- "Array of IDs to fetch (mix of context, task, and skill IDs). Use this to fetch multiple items in one call."
67
+ "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."
68
68
  }
69
69
  }
70
70
  }
71
71
  },
72
+ { name: "read_artifact", title: "Read Artifact", description: "Read one existing artifact by `artifact_id` without asking Tan to restream it in chat. Returns content plus render metadata and `config`/`state`/`data` when available. Prefer this when an external agent already has the artifact id and needs the current artifact payload directly.", inputSchema: { type: "object", properties: { space_id: { type: "string", description: "Optional: Space containing the artifact. Provide this for shared/org spaces so access checks resolve against the correct graph." }, artifact_id: { type: "string", description: "REQUIRED: Existing artifact ID to read (e.g. `artifact_123`)." }, item_id: { type: "string", description: "Optional alias for `artifact_id`." }, organization_id: { type: "string", description: "Optional Clerk org ID when the space belongs to an organization graph." } }, required: ["artifact_id"] } },
72
73
  {
73
74
  name: "usage_status",
74
75
  title: "Usage Status",
@@ -839,7 +840,7 @@ const TOOL_DEFINITIONS = [
839
840
  name: "message",
840
841
  title: "Message Assistant",
841
842
  description:
842
- "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.",
843
+ "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` and keep reusing the same `conversation_id`; `channel_id` scopes context, while `conversation_id` is the durable thread anchor.",
843
844
  inputSchema: {
844
845
  type: "object",
845
846
  properties: {
@@ -864,17 +865,27 @@ const TOOL_DEFINITIONS = [
864
865
  new_conversation: {
865
866
  type: "boolean",
866
867
  description:
867
- "Optional. When true, force a fresh conversation instead of reusing the current active thread."
868
+ "Optional escape hatch. When true, force a fresh conversation instead of reusing the current active thread."
868
869
  },
869
870
  session_id: {
870
871
  type: "string",
871
872
  description:
872
- "Optional runtime session ID to reuse across calls. Reuse the returned session_id for best continuity and lower warm-up overhead."
873
+ "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."
873
874
  },
874
875
  project_id: {
875
876
  type: "string",
876
877
  description: "Optional project scope for the assistant turn."
877
878
  },
879
+ group_id: {
880
+ type: "string",
881
+ description:
882
+ "Optional group scope for the assistant turn. Use this with channel_id for group-scoped coordination."
883
+ },
884
+ channel_id: {
885
+ type: "string",
886
+ description:
887
+ "Optional route/channel scope for the assistant turn. Defaults to root when omitted. Examples: root, group|legal, project|work/launch."
888
+ },
878
889
  organization_id: {
879
890
  type: "string",
880
891
  description:
@@ -941,6 +952,7 @@ const TOOL_DEFINITIONS = [
941
952
  const READ_ONLY_TOOLS = new Set([
942
953
  "search",
943
954
  "fetch_items",
955
+ "read_artifact",
944
956
  "usage_status",
945
957
  "fetch_conversation_messages",
946
958
  "list_conversation_inbox",
@@ -958,6 +970,7 @@ const DESTRUCTIVE_TOOLS = new Set([
958
970
  const IDEMPOTENT_TOOLS = new Set([
959
971
  "search",
960
972
  "fetch_items",
973
+ "read_artifact",
961
974
  "usage_status",
962
975
  "fetch_conversation_messages",
963
976
  "list_conversation_inbox",