@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 +2 -1
- package/README.md +2 -2
- package/dist/index.js +2 -2
- package/dist/tool-definitions.js +17 -6
- package/index.ts +2 -2
- package/package.json +1 -1
- package/tool-definitions.ts +19 -6
package/.env.local
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
MCP_API_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://
|
|
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://
|
|
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://
|
|
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://
|
|
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
|
}
|
package/dist/tool-definitions.js
CHANGED
|
@@ -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.
|
|
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 (
|
|
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,
|
|
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.
|
|
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.
|
|
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://
|
|
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://
|
|
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
package/tool-definitions.ts
CHANGED
|
@@ -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.
|
|
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 (
|
|
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,
|
|
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.
|
|
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.
|
|
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",
|