@t0ken.ai/memoryx-mcp-server 2.0.0 → 2.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 +38 -52
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -16
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +27 -18
package/README.md
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
# MemoryX MCP Server
|
|
2
2
|
|
|
3
|
-
MemoryX MCP Server
|
|
3
|
+
MemoryX MCP Server for Cursor, VS Code, Claude Desktop and other MCP clients.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Powered by **@t0ken.ai/memoryx-sdk**
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **search_memory**: 搜索历史记忆
|
|
9
|
-
- **get_account_info**: 获取账户信息
|
|
7
|
+
## Features
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
- **save_memory**: Save important information to memory system
|
|
10
|
+
- **search_memory**: Search historical memories
|
|
11
|
+
- **get_account_info**: Get account information
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
- 按 conversation 分组批量发送
|
|
15
|
-
- 自动重试机制
|
|
16
|
-
- 离线支持
|
|
13
|
+
## Characteristics
|
|
17
14
|
|
|
18
|
-
|
|
15
|
+
- Based on @t0ken.ai/memoryx-sdk
|
|
16
|
+
- MCP mode: LLM summarizes and sends single memory additions
|
|
17
|
+
- Server extracts entities directly without LLM summarization
|
|
18
|
+
- Trigger: 20k tokens or 1 minute idle
|
|
19
|
+
- Automatic retry mechanism
|
|
20
|
+
- Offline support
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
### Option 1: NPM Install
|
|
21
25
|
|
|
22
26
|
```bash
|
|
23
|
-
npm install -g @t0ken/memoryx-mcp-server
|
|
27
|
+
npm install -g @t0ken.ai/memoryx-mcp-server
|
|
24
28
|
```
|
|
25
29
|
|
|
26
|
-
###
|
|
30
|
+
### Option 2: Install from Source
|
|
27
31
|
|
|
28
32
|
```bash
|
|
29
33
|
cd plugins/memoryx-mcp-server
|
|
@@ -32,11 +36,11 @@ npm run build
|
|
|
32
36
|
npm link
|
|
33
37
|
```
|
|
34
38
|
|
|
35
|
-
##
|
|
39
|
+
## Configuration
|
|
36
40
|
|
|
37
41
|
### Cursor / VS Code
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
Add to `~/.cursor/mcp.json` or VS Code MCP config:
|
|
40
44
|
|
|
41
45
|
```json
|
|
42
46
|
{
|
|
@@ -54,7 +58,7 @@ npm link
|
|
|
54
58
|
|
|
55
59
|
### Claude Desktop
|
|
56
60
|
|
|
57
|
-
|
|
61
|
+
Add to Claude Desktop config file:
|
|
58
62
|
|
|
59
63
|
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
60
64
|
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
@@ -72,49 +76,31 @@ npm link
|
|
|
72
76
|
}
|
|
73
77
|
```
|
|
74
78
|
|
|
75
|
-
##
|
|
76
|
-
|
|
77
|
-
### 自动注册
|
|
79
|
+
## Usage
|
|
78
80
|
|
|
79
|
-
|
|
81
|
+
### Auto Registration
|
|
80
82
|
|
|
81
|
-
|
|
83
|
+
If no API Key is provided, MCP Server will auto-register and generate one.
|
|
82
84
|
|
|
83
|
-
|
|
84
|
-
2. 登录后复制 API Key
|
|
85
|
-
3. 配置到环境变量 `MEMORYX_API_KEY`
|
|
85
|
+
### Manual Binding
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
1. Visit https://t0ken.ai/portal
|
|
88
|
+
2. Login and copy API Key
|
|
89
|
+
3. Configure environment variable `MEMORYX_API_KEY`
|
|
88
90
|
|
|
89
|
-
|
|
91
|
+
## Local Storage
|
|
90
92
|
|
|
91
|
-
|
|
92
|
-
- `mcp-server.log` - 日志文件
|
|
93
|
+
Data is stored in `~/.memoryx/mcp-server/` directory.
|
|
93
94
|
|
|
94
|
-
##
|
|
95
|
+
## MCP Mode vs OpenClaw Conversation Mode
|
|
95
96
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
│ │
|
|
103
|
-
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
|
|
104
|
-
│ │ MCP Tools │───→│ send_queue │───→│ /conversations│ │
|
|
105
|
-
│ │ │ │ 表 │ │ /flush │ │
|
|
106
|
-
│ └─────────────┘ └──────────────┘ └───────────────┘ │
|
|
107
|
-
│ │
|
|
108
|
-
│ 特点: │
|
|
109
|
-
│ • 每条消息先存本地 SQLite │
|
|
110
|
-
│ • 按 conversation_id 分组 │
|
|
111
|
-
│ • 2 轮对话后触发发送 │
|
|
112
|
-
│ • 定时器每 5 秒检查队列 │
|
|
113
|
-
│ • 失败重试最多 5 次 │
|
|
114
|
-
│ │
|
|
115
|
-
└─────────────────────────────────────────────────────────────┘
|
|
116
|
-
```
|
|
97
|
+
| Feature | MCP Server | OpenClaw Plugin |
|
|
98
|
+
|---------|------------|-----------------|
|
|
99
|
+
| Data Source | LLM summarized single additions | Bidirectional conversation flow |
|
|
100
|
+
| Server Processing | Direct entity extraction | LLM summarization then extraction |
|
|
101
|
+
| Trigger Mechanism | 20k tokens / 1 min idle | 30k tokens / 5 min idle |
|
|
102
|
+
| Use Case | Cursor/Claude Desktop | OpenClaw Gateway |
|
|
117
103
|
|
|
118
104
|
## License
|
|
119
105
|
|
|
120
|
-
MIT
|
|
106
|
+
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Powered by @t0ken.ai/memoryx-sdk
|
|
6
6
|
*
|
|
7
|
+
* MCP mode (different from OpenClaw conversation flow):
|
|
8
|
+
* - LLM summarizes and sends single memory additions
|
|
9
|
+
* - Server extracts entities directly without LLM summarization
|
|
10
|
+
* - Trigger: 20k tokens or 1 minute idle
|
|
11
|
+
*
|
|
7
12
|
* Features:
|
|
8
|
-
* - conversation preset (30k tokens / 5min idle)
|
|
9
13
|
* - Lazy SDK initialization
|
|
10
14
|
* - Automatic memory batching and retry
|
|
11
15
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
package/dist/index.js
CHANGED
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Powered by @t0ken.ai/memoryx-sdk
|
|
7
7
|
*
|
|
8
|
+
* MCP mode (different from OpenClaw conversation flow):
|
|
9
|
+
* - LLM summarizes and sends single memory additions
|
|
10
|
+
* - Server extracts entities directly without LLM summarization
|
|
11
|
+
* - Trigger: 20k tokens or 1 minute idle
|
|
12
|
+
*
|
|
8
13
|
* Features:
|
|
9
|
-
* - conversation preset (30k tokens / 5min idle)
|
|
10
14
|
* - Lazy SDK initialization
|
|
11
15
|
* - Automatic memory batching and retry
|
|
12
16
|
*/
|
|
@@ -69,16 +73,21 @@ async function getSDK() {
|
|
|
69
73
|
// Get env config
|
|
70
74
|
const envApiKey = process.env.MEMORYX_API_KEY || process.env.OPENMEMORYX_API_KEY;
|
|
71
75
|
const envApiUrl = process.env.MEMORYX_URL || process.env.OPENMEMORYX_URL;
|
|
72
|
-
//
|
|
76
|
+
// MCP Server uses LLM-summarized single additions (not conversation flow)
|
|
77
|
+
// Server extracts entities directly without LLM summarization
|
|
78
|
+
// Trigger: 20k tokens or 1 minute idle
|
|
73
79
|
sdkInstance = new MemoryXSDK({
|
|
74
|
-
|
|
80
|
+
strategy: {
|
|
81
|
+
maxTokens: 20000,
|
|
82
|
+
intervalMs: 60000 // 1 minute idle
|
|
83
|
+
},
|
|
75
84
|
apiKey: envApiKey || undefined,
|
|
76
85
|
apiUrl: envApiUrl || DEFAULT_API_BASE,
|
|
77
86
|
autoRegister: !envApiKey,
|
|
78
87
|
agentType: 'mcp',
|
|
79
88
|
storageDir: PLUGIN_DIR
|
|
80
89
|
});
|
|
81
|
-
log("SDK initialized
|
|
90
|
+
log("SDK initialized (20k tokens / 1min idle - MCP mode)");
|
|
82
91
|
return sdkInstance;
|
|
83
92
|
})();
|
|
84
93
|
return sdkInitPromise;
|
|
@@ -141,8 +150,8 @@ async function getAccountInfo() {
|
|
|
141
150
|
const stats = await sdk.getQueueStats();
|
|
142
151
|
return {
|
|
143
152
|
apiKey: info?.apiKey ? `${info.apiKey.slice(0, 8)}...` : null,
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
agentId: info?.agentId || null,
|
|
154
|
+
agentType: info?.quota?.agent_type || null,
|
|
146
155
|
queueLength: stats.messageCount
|
|
147
156
|
};
|
|
148
157
|
}
|
|
@@ -150,8 +159,8 @@ async function getAccountInfo() {
|
|
|
150
159
|
log(`getAccountInfo failed: ${e}`);
|
|
151
160
|
return {
|
|
152
161
|
apiKey: null,
|
|
153
|
-
|
|
154
|
-
|
|
162
|
+
agentId: null,
|
|
163
|
+
agentType: null,
|
|
155
164
|
queueLength: 0
|
|
156
165
|
};
|
|
157
166
|
}
|
|
@@ -170,17 +179,17 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
|
170
179
|
tools: [
|
|
171
180
|
{
|
|
172
181
|
name: "save_memory",
|
|
173
|
-
description: "
|
|
182
|
+
description: "Save information to long-term memory. ALWAYS call when: (1) User explicitly says 'remember', 'note this', 'don't forget'; (2) User corrects your error; (3) User expresses preferences (I like/hate/usually...); (4) User mentions important experiences or future plans; (5) End of conversation - generate a 100-word summary of key points. Categories (use in metadata.category): semantic (facts, preferences), episodic (events, experiences), procedural (skills, how-to), emotional (feelings), reflective (insights, lessons).",
|
|
174
183
|
inputSchema: {
|
|
175
184
|
type: "object",
|
|
176
185
|
properties: {
|
|
177
186
|
content: {
|
|
178
187
|
type: "string",
|
|
179
|
-
description: "
|
|
188
|
+
description: "Content to remember. For end-of-conversation summaries, keep within 100 words."
|
|
180
189
|
},
|
|
181
190
|
metadata: {
|
|
182
191
|
type: "object",
|
|
183
|
-
description: "
|
|
192
|
+
description: "Optional metadata. Supported fields: category (semantic/episodic/procedural/emotional/reflective), tags (array of strings)"
|
|
184
193
|
}
|
|
185
194
|
},
|
|
186
195
|
required: ["content"]
|
|
@@ -188,17 +197,17 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
|
188
197
|
},
|
|
189
198
|
{
|
|
190
199
|
name: "search_memory",
|
|
191
|
-
description: "
|
|
200
|
+
description: "Search historical memories. ALWAYS call BEFORE responding to: user questions about preferences/history, topics relating to past conversations, any personalized response. Workflow: search → review results → generate informed response.",
|
|
192
201
|
inputSchema: {
|
|
193
202
|
type: "object",
|
|
194
203
|
properties: {
|
|
195
204
|
query: {
|
|
196
205
|
type: "string",
|
|
197
|
-
description: "
|
|
206
|
+
description: "Search keywords or natural language question"
|
|
198
207
|
},
|
|
199
208
|
limit: {
|
|
200
209
|
type: "number",
|
|
201
|
-
description: "
|
|
210
|
+
description: "Number of results to return, default 5",
|
|
202
211
|
default: 5
|
|
203
212
|
}
|
|
204
213
|
},
|
|
@@ -207,7 +216,7 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
|
207
216
|
},
|
|
208
217
|
{
|
|
209
218
|
name: "get_account_info",
|
|
210
|
-
description: "
|
|
219
|
+
description: "Get current MemoryX account info including API Key, Agent ID, and queue status.",
|
|
211
220
|
inputSchema: {
|
|
212
221
|
type: "object",
|
|
213
222
|
properties: {}
|
|
@@ -266,7 +275,7 @@ server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
|
|
|
266
275
|
{
|
|
267
276
|
uri: "memoryx://status",
|
|
268
277
|
name: "MemoryX Status",
|
|
269
|
-
description: "
|
|
278
|
+
description: "Current MemoryX connection status and queue info",
|
|
270
279
|
mimeType: "application/json"
|
|
271
280
|
}
|
|
272
281
|
]
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t0ken.ai/memoryx-mcp-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "MemoryX MCP Server for Cursor/VS Code/Claude Desktop (powered by @t0ken.ai/memoryx-sdk)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
26
|
-
"@t0ken.ai/memoryx-sdk": "^1.
|
|
26
|
+
"@t0ken.ai/memoryx-sdk": "^1.4.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^20.0.0",
|
package/src/index.ts
CHANGED
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Powered by @t0ken.ai/memoryx-sdk
|
|
7
7
|
*
|
|
8
|
+
* MCP mode (different from OpenClaw conversation flow):
|
|
9
|
+
* - LLM summarizes and sends single memory additions
|
|
10
|
+
* - Server extracts entities directly without LLM summarization
|
|
11
|
+
* - Trigger: 20k tokens or 1 minute idle
|
|
12
|
+
*
|
|
8
13
|
* Features:
|
|
9
|
-
* - conversation preset (30k tokens / 5min idle)
|
|
10
14
|
* - Lazy SDK initialization
|
|
11
15
|
* - Automatic memory batching and retry
|
|
12
16
|
*/
|
|
@@ -47,9 +51,14 @@ async function getSDK(): Promise<any> {
|
|
|
47
51
|
const envApiKey = process.env.MEMORYX_API_KEY || process.env.OPENMEMORYX_API_KEY;
|
|
48
52
|
const envApiUrl = process.env.MEMORYX_URL || process.env.OPENMEMORYX_URL;
|
|
49
53
|
|
|
50
|
-
//
|
|
54
|
+
// MCP Server uses LLM-summarized single additions (not conversation flow)
|
|
55
|
+
// Server extracts entities directly without LLM summarization
|
|
56
|
+
// Trigger: 20k tokens or 1 minute idle
|
|
51
57
|
sdkInstance = new MemoryXSDK({
|
|
52
|
-
|
|
58
|
+
strategy: {
|
|
59
|
+
maxTokens: 20000,
|
|
60
|
+
intervalMs: 60000 // 1 minute idle
|
|
61
|
+
},
|
|
53
62
|
apiKey: envApiKey || undefined,
|
|
54
63
|
apiUrl: envApiUrl || DEFAULT_API_BASE,
|
|
55
64
|
autoRegister: !envApiKey,
|
|
@@ -57,7 +66,7 @@ async function getSDK(): Promise<any> {
|
|
|
57
66
|
storageDir: PLUGIN_DIR
|
|
58
67
|
});
|
|
59
68
|
|
|
60
|
-
log("SDK initialized
|
|
69
|
+
log("SDK initialized (20k tokens / 1min idle - MCP mode)");
|
|
61
70
|
return sdkInstance;
|
|
62
71
|
})();
|
|
63
72
|
|
|
@@ -128,8 +137,8 @@ async function searchMemory(query: string, limit: number = 5): Promise<{
|
|
|
128
137
|
|
|
129
138
|
async function getAccountInfo(): Promise<{
|
|
130
139
|
apiKey: string | null;
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
agentId: string | null;
|
|
141
|
+
agentType: string | null;
|
|
133
142
|
queueLength: number;
|
|
134
143
|
}> {
|
|
135
144
|
try {
|
|
@@ -139,16 +148,16 @@ async function getAccountInfo(): Promise<{
|
|
|
139
148
|
|
|
140
149
|
return {
|
|
141
150
|
apiKey: info?.apiKey ? `${info.apiKey.slice(0, 8)}...` : null,
|
|
142
|
-
|
|
143
|
-
|
|
151
|
+
agentId: info?.agentId || null,
|
|
152
|
+
agentType: info?.quota?.agent_type || null,
|
|
144
153
|
queueLength: stats.messageCount
|
|
145
154
|
};
|
|
146
155
|
} catch (e) {
|
|
147
156
|
log(`getAccountInfo failed: ${e}`);
|
|
148
157
|
return {
|
|
149
158
|
apiKey: null,
|
|
150
|
-
|
|
151
|
-
|
|
159
|
+
agentId: null,
|
|
160
|
+
agentType: null,
|
|
152
161
|
queueLength: 0
|
|
153
162
|
};
|
|
154
163
|
}
|
|
@@ -172,17 +181,17 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
172
181
|
tools: [
|
|
173
182
|
{
|
|
174
183
|
name: "save_memory",
|
|
175
|
-
description: "
|
|
184
|
+
description: "Save information to long-term memory. ALWAYS call when: (1) User explicitly says 'remember', 'note this', 'don't forget'; (2) User corrects your error; (3) User expresses preferences (I like/hate/usually...); (4) User mentions important experiences or future plans; (5) End of conversation - generate a 100-word summary of key points. Categories (use in metadata.category): semantic (facts, preferences), episodic (events, experiences), procedural (skills, how-to), emotional (feelings), reflective (insights, lessons).",
|
|
176
185
|
inputSchema: {
|
|
177
186
|
type: "object",
|
|
178
187
|
properties: {
|
|
179
188
|
content: {
|
|
180
189
|
type: "string",
|
|
181
|
-
description: "
|
|
190
|
+
description: "Content to remember. For end-of-conversation summaries, keep within 100 words."
|
|
182
191
|
},
|
|
183
192
|
metadata: {
|
|
184
193
|
type: "object",
|
|
185
|
-
description: "
|
|
194
|
+
description: "Optional metadata. Supported fields: category (semantic/episodic/procedural/emotional/reflective), tags (array of strings)"
|
|
186
195
|
}
|
|
187
196
|
},
|
|
188
197
|
required: ["content"]
|
|
@@ -190,17 +199,17 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
190
199
|
},
|
|
191
200
|
{
|
|
192
201
|
name: "search_memory",
|
|
193
|
-
description: "
|
|
202
|
+
description: "Search historical memories. ALWAYS call BEFORE responding to: user questions about preferences/history, topics relating to past conversations, any personalized response. Workflow: search → review results → generate informed response.",
|
|
194
203
|
inputSchema: {
|
|
195
204
|
type: "object",
|
|
196
205
|
properties: {
|
|
197
206
|
query: {
|
|
198
207
|
type: "string",
|
|
199
|
-
description: "
|
|
208
|
+
description: "Search keywords or natural language question"
|
|
200
209
|
},
|
|
201
210
|
limit: {
|
|
202
211
|
type: "number",
|
|
203
|
-
description: "
|
|
212
|
+
description: "Number of results to return, default 5",
|
|
204
213
|
default: 5
|
|
205
214
|
}
|
|
206
215
|
},
|
|
@@ -209,7 +218,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
209
218
|
},
|
|
210
219
|
{
|
|
211
220
|
name: "get_account_info",
|
|
212
|
-
description: "
|
|
221
|
+
description: "Get current MemoryX account info including API Key, Agent ID, and queue status.",
|
|
213
222
|
inputSchema: {
|
|
214
223
|
type: "object",
|
|
215
224
|
properties: {}
|
|
@@ -274,7 +283,7 @@ server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
|
274
283
|
{
|
|
275
284
|
uri: "memoryx://status",
|
|
276
285
|
name: "MemoryX Status",
|
|
277
|
-
description: "
|
|
286
|
+
description: "Current MemoryX connection status and queue info",
|
|
278
287
|
mimeType: "application/json"
|
|
279
288
|
}
|
|
280
289
|
]
|