@zsc-glitch/knowledge-keeper-mcp 0.2.0-alpha.1 → 0.3.0-alpha.1
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 +36 -7
- package/dist/embedding.d.ts +5 -3
- package/dist/embedding.js +5 -3
- package/dist/resources/index.d.ts +1 -0
- package/dist/resources/index.js +98 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
# Knowledge Keeper MCP Server
|
|
2
2
|
|
|
3
|
-
> 智能知识管理的 Model Context Protocol
|
|
3
|
+
> 智能知识管理的 Model Context Protocol 实现,支持语义搜索
|
|
4
4
|
|
|
5
5
|
## 简介
|
|
6
6
|
|
|
7
7
|
让 **knowledge-keeper** 可被 Claude Code、Cursor、Gemini CLI、Windsurf 等工具调用。
|
|
8
8
|
|
|
9
|
+
## 特性
|
|
10
|
+
|
|
11
|
+
- ✅ **7 个 MCP Tools** - 完整的知识管理
|
|
12
|
+
- ✅ **语义搜索** - TF-IDF 向量嵌入,无外部依赖
|
|
13
|
+
- ✅ **本地优先** - 所有数据存储在本地
|
|
14
|
+
- ✅ **独立运行** - 不依赖 OpenClaw 运行时
|
|
15
|
+
|
|
9
16
|
## 安装
|
|
10
17
|
|
|
11
18
|
```bash
|
|
12
|
-
npm install @zsc-glitch/knowledge-keeper-mcp
|
|
19
|
+
npm install @zsc-glitch/knowledge-keeper-mcp@alpha
|
|
13
20
|
```
|
|
14
21
|
|
|
15
22
|
## 使用
|
|
@@ -39,19 +46,41 @@ claude mcp add knowledge-keeper -- npx @zsc-glitch/knowledge-keeper-mcp
|
|
|
39
46
|
| Tool | 功能 |
|
|
40
47
|
|------|------|
|
|
41
48
|
| `knowledge_save` | 保存知识点 |
|
|
42
|
-
| `knowledge_search` |
|
|
49
|
+
| `knowledge_search` | 关键词搜索 |
|
|
50
|
+
| `knowledge_semantic_search` | 🆕 语义搜索 |
|
|
43
51
|
| `knowledge_get` | 获取单个知识点 |
|
|
44
52
|
| `knowledge_update` | 更新知识点 |
|
|
45
53
|
| `knowledge_delete` | 删除知识点 |
|
|
46
54
|
| `knowledge_tags` | 列出标签 |
|
|
47
55
|
|
|
48
|
-
## MCP Resources
|
|
56
|
+
## MCP Resources
|
|
49
57
|
|
|
50
58
|
| Resource | URI | 说明 |
|
|
51
59
|
|----------|-----|------|
|
|
52
|
-
|
|
|
53
|
-
| 标签索引 | `knowledge:///tags` |
|
|
54
|
-
|
|
|
60
|
+
| 知识库概览 | `knowledge:///list` | 列出所有资源 |
|
|
61
|
+
| 标签索引 | `knowledge:///tags` | 所有标签及计数 |
|
|
62
|
+
| 概念类知识 | `knowledge:///type/concept` | 概念类知识点列表 |
|
|
63
|
+
| 决策类知识 | `knowledge:///type/decision` | 决策类知识点列表 |
|
|
64
|
+
| 待办事项 | `knowledge:///type/todo` | 待办类知识点列表 |
|
|
65
|
+
| 笔记 | `knowledge:///type/note` | 笔记类知识点列表 |
|
|
66
|
+
| 项目记录 | `knowledge:///type/project` | 项目类知识点列表 |
|
|
67
|
+
|
|
68
|
+
## 数据存储
|
|
69
|
+
|
|
70
|
+
- 默认位置:`~/.knowledge-vault/`
|
|
71
|
+
- 知识点:`~/.knowledge-vault/{type}/{id}.md`
|
|
72
|
+
- 向量索引:`~/.knowledge-vault/vectors.json`
|
|
73
|
+
- 可通过环境变量 `KNOWLEDGE_KEEPER_DIR` 自定义
|
|
74
|
+
|
|
75
|
+
## 语义搜索
|
|
76
|
+
|
|
77
|
+
默认使用 TF-IDF 向量嵌入,无需额外依赖。
|
|
78
|
+
|
|
79
|
+
**升级到 Transformer 模型:**
|
|
80
|
+
```bash
|
|
81
|
+
npm install @xenova/transformers
|
|
82
|
+
EMBEDDING_MODEL=transformers npx @zsc-glitch/knowledge-keeper-mcp
|
|
83
|
+
```
|
|
55
84
|
|
|
56
85
|
## 开发
|
|
57
86
|
|
package/dist/embedding.d.ts
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* 语义搜索模块 - 使用向量嵌入实现真正的语义搜索
|
|
4
4
|
*
|
|
5
5
|
* 技术方案:
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
6
|
+
* - 默认: TF-IDF 嵌入(轻量,无依赖)
|
|
7
|
+
* - 可选: @xenova/transformers 模型(需要安装额外依赖)
|
|
8
|
+
*
|
|
9
|
+
* 配置:
|
|
10
|
+
* - EMBEDDING_MODEL=tfidf (默认) 或 transformers
|
|
9
11
|
*/
|
|
10
12
|
type Vector = number[];
|
|
11
13
|
/**
|
package/dist/embedding.js
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* 语义搜索模块 - 使用向量嵌入实现真正的语义搜索
|
|
4
4
|
*
|
|
5
5
|
* 技术方案:
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
6
|
+
* - 默认: TF-IDF 嵌入(轻量,无依赖)
|
|
7
|
+
* - 可选: @xenova/transformers 模型(需要安装额外依赖)
|
|
8
|
+
*
|
|
9
|
+
* 配置:
|
|
10
|
+
* - EMBEDDING_MODEL=tfidf (默认) 或 transformers
|
|
9
11
|
*/
|
|
10
12
|
import * as fs from "fs/promises";
|
|
11
13
|
import * as path from "path";
|
package/dist/resources/index.js
CHANGED
|
@@ -1,10 +1,104 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP Resources 注册
|
|
3
|
+
* 提供知识点的只读访问
|
|
3
4
|
*/
|
|
5
|
+
import { listTags, searchKnowledge } from "../core.js";
|
|
4
6
|
export function registerResources(server) {
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// 资源列表(静态)
|
|
8
|
+
server.registerResource("knowledge-list", "knowledge:///list", {
|
|
9
|
+
title: "知识库概览",
|
|
10
|
+
description: "列出知识库中的所有知识点类型",
|
|
11
|
+
mimeType: "application/json",
|
|
12
|
+
}, async () => {
|
|
13
|
+
const tags = await listTags();
|
|
14
|
+
const tagCount = Object.keys(tags).length;
|
|
15
|
+
const totalEntries = Object.values(tags).reduce((a, b) => a + b, 0);
|
|
16
|
+
return {
|
|
17
|
+
contents: [
|
|
18
|
+
{
|
|
19
|
+
uri: "knowledge:///list",
|
|
20
|
+
text: JSON.stringify({
|
|
21
|
+
message: "知识库资源列表",
|
|
22
|
+
types: ["concept", "decision", "todo", "note", "project"],
|
|
23
|
+
stats: {
|
|
24
|
+
totalTags: tagCount,
|
|
25
|
+
taggedEntries: totalEntries,
|
|
26
|
+
},
|
|
27
|
+
resources: [
|
|
28
|
+
{ uri: "knowledge:///tags", name: "标签索引" },
|
|
29
|
+
{ uri: "knowledge:///type/concept", name: "概念类知识" },
|
|
30
|
+
{ uri: "knowledge:///type/decision", name: "决策类知识" },
|
|
31
|
+
{ uri: "knowledge:///type/todo", name: "待办事项" },
|
|
32
|
+
{ uri: "knowledge:///type/note", name: "笔记" },
|
|
33
|
+
{ uri: "knowledge:///type/project", name: "项目记录" },
|
|
34
|
+
],
|
|
35
|
+
usage: "使用 knowledge:///{id} 访问单个知识点",
|
|
36
|
+
}, null, 2),
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
// 标签索引
|
|
42
|
+
server.registerResource("knowledge-tags", "knowledge:///tags", {
|
|
43
|
+
title: "标签索引",
|
|
44
|
+
description: "知识库中所有标签的列表",
|
|
45
|
+
mimeType: "application/json",
|
|
46
|
+
}, async () => {
|
|
47
|
+
const tags = await listTags();
|
|
48
|
+
const sortedTags = Object.entries(tags)
|
|
49
|
+
.sort((a, b) => b[1] - a[1])
|
|
50
|
+
.map(([tag, count]) => ({ tag, count }));
|
|
51
|
+
return {
|
|
52
|
+
contents: [
|
|
53
|
+
{
|
|
54
|
+
uri: "knowledge:///tags",
|
|
55
|
+
text: JSON.stringify({
|
|
56
|
+
total: sortedTags.length,
|
|
57
|
+
tags: sortedTags,
|
|
58
|
+
}, null, 2),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
// 按类型列出
|
|
64
|
+
const types = ["concept", "decision", "todo", "note", "project"];
|
|
65
|
+
const typeNames = {
|
|
66
|
+
concept: "概念类知识",
|
|
67
|
+
decision: "决策类知识",
|
|
68
|
+
todo: "待办事项",
|
|
69
|
+
note: "笔记",
|
|
70
|
+
project: "项目记录",
|
|
71
|
+
};
|
|
72
|
+
for (const type of types) {
|
|
73
|
+
server.registerResource(`knowledge-type-${type}`, `knowledge:///type/${type}`, {
|
|
74
|
+
title: typeNames[type],
|
|
75
|
+
description: `列出所有${typeNames[type]}`,
|
|
76
|
+
mimeType: "application/json",
|
|
77
|
+
}, async () => {
|
|
78
|
+
const results = await searchKnowledge({
|
|
79
|
+
query: "",
|
|
80
|
+
type,
|
|
81
|
+
limit: 100,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
contents: [
|
|
85
|
+
{
|
|
86
|
+
uri: `knowledge:///type/${type}`,
|
|
87
|
+
text: JSON.stringify({
|
|
88
|
+
type,
|
|
89
|
+
name: typeNames[type],
|
|
90
|
+
count: results.length,
|
|
91
|
+
entries: results.map((kp) => ({
|
|
92
|
+
id: kp.id,
|
|
93
|
+
title: kp.title,
|
|
94
|
+
tags: kp.tags,
|
|
95
|
+
created: kp.created,
|
|
96
|
+
})),
|
|
97
|
+
}, null, 2),
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
9
103
|
}
|
|
10
104
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zsc-glitch/knowledge-keeper-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP Server for Knowledge Keeper - 智能知识管理的 Model Context Protocol
|
|
3
|
+
"version": "0.3.0-alpha.1",
|
|
4
|
+
"description": "MCP Server for Knowledge Keeper - 智能知识管理的 Model Context Protocol 实现,支持语义搜索和资源访问",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|