abb-opencode-local-rag 0.1.0
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/LICENSE +21 -0
- package/README.de.md +416 -0
- package/README.es.md +416 -0
- package/README.fr.md +416 -0
- package/README.md +491 -0
- package/README.pt-BR.md +416 -0
- package/README.zh-CN.md +416 -0
- package/dist/bin/install-skills.d.ts +20 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +195 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +24 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +97 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +294 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +28 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +219 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/cli/common.d.ts +65 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +138 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/delete.d.ts +8 -0
- package/dist/cli/delete.d.ts.map +1 -0
- package/dist/cli/delete.js +173 -0
- package/dist/cli/delete.js.map +1 -0
- package/dist/cli/file-collection.d.ts +2 -0
- package/dist/cli/file-collection.d.ts.map +1 -0
- package/dist/cli/file-collection.js +53 -0
- package/dist/cli/file-collection.js.map +1 -0
- package/dist/cli/ingest.d.ts +100 -0
- package/dist/cli/ingest.d.ts.map +1 -0
- package/dist/cli/ingest.js +363 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/list.d.ts +35 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +210 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/options.d.ts +100 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +241 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/query.d.ts +24 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +191 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/read-neighbors.d.ts +11 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +224 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli/status.d.ts +8 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +80 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync.d.ts +8 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +244 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli-main.d.ts +12 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +63 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/embedder/index.d.ts +85 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +284 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/features/list.d.ts +37 -0
- package/dist/features/list.d.ts.map +1 -0
- package/dist/features/list.js +40 -0
- package/dist/features/list.js.map +1 -0
- package/dist/features/sync.d.ts +207 -0
- package/dist/features/sync.d.ts.map +1 -0
- package/dist/features/sync.js +380 -0
- package/dist/features/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/compute.d.ts +86 -0
- package/dist/ingest/compute.d.ts.map +1 -0
- package/dist/ingest/compute.js +177 -0
- package/dist/ingest/compute.js.map +1 -0
- package/dist/ingest/file.d.ts +27 -0
- package/dist/ingest/file.d.ts.map +1 -0
- package/dist/ingest/file.js +67 -0
- package/dist/ingest/file.js.map +1 -0
- package/dist/ingest/visual.d.ts +45 -0
- package/dist/ingest/visual.d.ts.map +1 -0
- package/dist/ingest/visual.js +234 -0
- package/dist/ingest/visual.js.map +1 -0
- package/dist/parser/docx-parser.d.ts +12 -0
- package/dist/parser/docx-parser.d.ts.map +1 -0
- package/dist/parser/docx-parser.js +328 -0
- package/dist/parser/docx-parser.js.map +1 -0
- package/dist/parser/html-parser.d.ts +18 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +102 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +214 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +454 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-extract.d.ts +81 -0
- package/dist/parser/pdf-extract.d.ts.map +1 -0
- package/dist/parser/pdf-extract.js +112 -0
- package/dist/parser/pdf-extract.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +117 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +528 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/parser/title-extractor.d.ts +69 -0
- package/dist/parser/title-extractor.d.ts.map +1 -0
- package/dist/parser/title-extractor.js +145 -0
- package/dist/parser/title-extractor.js.map +1 -0
- package/dist/pdf-visual/captioner.d.ts +16 -0
- package/dist/pdf-visual/captioner.d.ts.map +1 -0
- package/dist/pdf-visual/captioner.js +63 -0
- package/dist/pdf-visual/captioner.js.map +1 -0
- package/dist/pdf-visual/captioners/fast.d.ts +7 -0
- package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/fast.js +103 -0
- package/dist/pdf-visual/captioners/fast.js.map +1 -0
- package/dist/pdf-visual/captioners/quality.d.ts +7 -0
- package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/quality.js +127 -0
- package/dist/pdf-visual/captioners/quality.js.map +1 -0
- package/dist/pdf-visual/captioners/shared.d.ts +44 -0
- package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/shared.js +104 -0
- package/dist/pdf-visual/captioners/shared.js.map +1 -0
- package/dist/pdf-visual/detector.d.ts +9 -0
- package/dist/pdf-visual/detector.d.ts.map +1 -0
- package/dist/pdf-visual/detector.js +234 -0
- package/dist/pdf-visual/detector.js.map +1 -0
- package/dist/pdf-visual/index.d.ts +13 -0
- package/dist/pdf-visual/index.d.ts.map +1 -0
- package/dist/pdf-visual/index.js +45 -0
- package/dist/pdf-visual/index.js.map +1 -0
- package/dist/pdf-visual/renderer.d.ts +9 -0
- package/dist/pdf-visual/renderer.d.ts.map +1 -0
- package/dist/pdf-visual/renderer.js +177 -0
- package/dist/pdf-visual/renderer.js.map +1 -0
- package/dist/pdf-visual/types.d.ts +62 -0
- package/dist/pdf-visual/types.d.ts.map +1 -0
- package/dist/pdf-visual/types.js +32 -0
- package/dist/pdf-visual/types.js.map +1 -0
- package/dist/server/error-utils.d.ts +79 -0
- package/dist/server/error-utils.d.ts.map +1 -0
- package/dist/server/error-utils.js +148 -0
- package/dist/server/error-utils.js.map +1 -0
- package/dist/server/index.d.ts +258 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1104 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/list-scanner.d.ts +52 -0
- package/dist/server/list-scanner.d.ts.map +1 -0
- package/dist/server/list-scanner.js +72 -0
- package/dist/server/list-scanner.js.map +1 -0
- package/dist/server/tool-definitions.d.ts +8 -0
- package/dist/server/tool-definitions.d.ts.map +1 -0
- package/dist/server/tool-definitions.js +181 -0
- package/dist/server/tool-definitions.js.map +1 -0
- package/dist/server/tool-input.d.ts +37 -0
- package/dist/server/tool-input.d.ts.map +1 -0
- package/dist/server/tool-input.js +216 -0
- package/dist/server/tool-input.js.map +1 -0
- package/dist/server/types.d.ts +331 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server-main.d.ts +46 -0
- package/dist/server-main.d.ts.map +1 -0
- package/dist/server-main.js +242 -0
- package/dist/server-main.js.map +1 -0
- package/dist/utils/base-dirs.d.ts +212 -0
- package/dist/utils/base-dirs.d.ts.map +1 -0
- package/dist/utils/base-dirs.js +422 -0
- package/dist/utils/base-dirs.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/limits.d.ts +26 -0
- package/dist/utils/limits.d.ts.map +1 -0
- package/dist/utils/limits.js +28 -0
- package/dist/utils/limits.js.map +1 -0
- package/dist/utils/list-sources.d.ts +47 -0
- package/dist/utils/list-sources.d.ts.map +1 -0
- package/dist/utils/list-sources.js +50 -0
- package/dist/utils/list-sources.js.map +1 -0
- package/dist/utils/raw-data-utils.d.ts +131 -0
- package/dist/utils/raw-data-utils.d.ts.map +1 -0
- package/dist/utils/raw-data-utils.js +255 -0
- package/dist/utils/raw-data-utils.js.map +1 -0
- package/dist/utils/scan.d.ts +126 -0
- package/dist/utils/scan.d.ts.map +1 -0
- package/dist/utils/scan.js +221 -0
- package/dist/utils/scan.js.map +1 -0
- package/dist/utils/scope-match.d.ts +43 -0
- package/dist/utils/scope-match.d.ts.map +1 -0
- package/dist/utils/scope-match.js +87 -0
- package/dist/utils/scope-match.js.map +1 -0
- package/dist/utils/sensitive-path.d.ts +23 -0
- package/dist/utils/sensitive-path.d.ts.map +1 -0
- package/dist/utils/sensitive-path.js +91 -0
- package/dist/utils/sensitive-path.js.map +1 -0
- package/dist/utils/sync-path-key.d.ts +20 -0
- package/dist/utils/sync-path-key.d.ts.map +1 -0
- package/dist/utils/sync-path-key.js +33 -0
- package/dist/utils/sync-path-key.js.map +1 -0
- package/dist/vectordb/index.d.ts +168 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +619 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/search-filters.d.ts +39 -0
- package/dist/vectordb/search-filters.d.ts.map +1 -0
- package/dist/vectordb/search-filters.js +136 -0
- package/dist/vectordb/search-filters.js.map +1 -0
- package/dist/vectordb/types.d.ts +196 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +224 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +105 -0
- package/skills/mcp-local-rag/SKILL.md +308 -0
- package/skills/mcp-local-rag/references/cli-reference.md +175 -0
- package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
- package/skills/mcp-local-rag/references/query-optimization.md +57 -0
- package/skills/mcp-local-rag/references/result-refinement.md +56 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/banner.jpg" alt="MCP Local RAG: Search below the surface." width="600" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# MCP Local RAG
|
|
6
|
+
|
|
7
|
+
[](https://github.com/shinpr/mcp-local-rag)
|
|
8
|
+
[](https://www.npmjs.com/package/mcp-local-rag)
|
|
9
|
+
[](https://opensource.org/licenses/MIT)
|
|
10
|
+
[](https://registry.modelcontextprotocol.io/)
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="README.md">English</a> |
|
|
14
|
+
<strong>简体中文</strong> |
|
|
15
|
+
<a href="README.de.md">Deutsch</a> |
|
|
16
|
+
<a href="README.es.md">Español</a> |
|
|
17
|
+
<a href="README.pt-BR.md">Português (Brasil)</a> |
|
|
18
|
+
<a href="README.fr.md">Français</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
通过 MCP 客户端或终端搜索私有文档,无需将内容发送给嵌入 API。
|
|
22
|
+
|
|
23
|
+
mcp-local-rag 在本机为 PDF、DOCX、Markdown 和文本文件建立索引。搜索结合语义相似度与关键词匹配,既能理解查询意图,也能准确匹配 API 名称、类名和错误代码等技术术语。
|
|
24
|
+
|
|
25
|
+
## 功能
|
|
26
|
+
|
|
27
|
+
- **本地运行:** 文档解析、嵌入、存储和搜索全部在本机完成。首次下载模型后,文本导入和搜索均可离线使用。
|
|
28
|
+
- **混合搜索:** 语义检索负责查找相关概念,关键词匹配则提高精确技术术语的排名。
|
|
29
|
+
- **可配置嵌入模型:** 可根据文档的语言和领域选择合适的 Hugging Face 嵌入模型。
|
|
30
|
+
- **语义分块:** 按主题边界而非固定字符数拆分文档,并保持 Markdown 代码块完整。
|
|
31
|
+
- **MCP 和 CLI:** AI 编程工具与终端可使用同一份索引。
|
|
32
|
+
|
|
33
|
+
无需 API 密钥、Docker、Python 或外部数据库。
|
|
34
|
+
|
|
35
|
+
## 快速开始
|
|
36
|
+
|
|
37
|
+
### 使用要求
|
|
38
|
+
|
|
39
|
+
- Node.js 22 或更高版本
|
|
40
|
+
- 首次使用时需要联网下载 npm 包和嵌入模型
|
|
41
|
+
- 一个包含待搜索文档的目录
|
|
42
|
+
|
|
43
|
+
将 `BASE_DIR` 设置为该目录。它同时也是文件操作的安全边界。请将下方的 `/absolute/path/to/your/documents` 替换为该目录的绝对路径。
|
|
44
|
+
|
|
45
|
+
mcp-local-rag 通过本地 stdio 服务器使用标准 MCP 协议,因此可与支持本地 MCP 服务器的 AI 编程工具及其他 MCP 宿主配合使用。
|
|
46
|
+
|
|
47
|
+
可直接使用以下示例,也可以按照客户端的 MCP 配置格式注册 `npx -y mcp-local-rag` 并设置 `BASE_DIR`。
|
|
48
|
+
|
|
49
|
+
**Claude Code:** 运行以下命令:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
claude mcp add local-rag --scope user --env BASE_DIR=/absolute/path/to/your/documents -- npx -y mcp-local-rag
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Codex:** 在 `~/.codex/config.toml` 中添加:
|
|
56
|
+
|
|
57
|
+
```toml
|
|
58
|
+
[mcp_servers.local-rag]
|
|
59
|
+
command = "npx"
|
|
60
|
+
args = ["-y", "mcp-local-rag"]
|
|
61
|
+
|
|
62
|
+
[mcp_servers.local-rag.env]
|
|
63
|
+
BASE_DIR = "/absolute/path/to/your/documents"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**OpenCode:** 在 `~/.config/opencode/opencode.json`(或 `opencode.jsonc`)中添加:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"$schema": "https://opencode.ai/config.json",
|
|
71
|
+
"mcp": {
|
|
72
|
+
"local-rag": {
|
|
73
|
+
"type": "local",
|
|
74
|
+
"command": ["npx", "-y", "mcp-local-rag"],
|
|
75
|
+
"environment": {
|
|
76
|
+
"BASE_DIR": "/absolute/path/to/your/documents"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Cursor:** 在 `~/.cursor/mcp.json` 中添加:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"mcpServers": {
|
|
88
|
+
"local-rag": {
|
|
89
|
+
"command": "npx",
|
|
90
|
+
"args": ["-y", "mcp-local-rag"],
|
|
91
|
+
"env": {
|
|
92
|
+
"BASE_DIR": "/absolute/path/to/your/documents"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
重启客户端,然后让它创建索引:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
同步已配置根目录中的所有文档,并等待同步完成。
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
首次同步会下载默认嵌入模型(约 90 MB)。开始导入前可能需要等待 1–2 分钟,之后会直接使用本地缓存。
|
|
106
|
+
|
|
107
|
+
同步完成后即可提问:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
API 文档如何说明身份验证?
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### CLI 快速开始
|
|
114
|
+
|
|
115
|
+
不使用 MCP 客户端时,可直接通过 CLI 操作:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx mcp-local-rag ingest ./docs/
|
|
119
|
+
npx mcp-local-rag query "身份验证 API"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
CLI 默认将当前目录作为文档根目录。请在同一目录中运行这两条命令,以便共用默认索引;也可以显式设置 `BASE_DIR` 和 `DB_PATH`。
|
|
123
|
+
|
|
124
|
+
## 为什么开发它
|
|
125
|
+
|
|
126
|
+
出于保密要求或组织政策,有些文档不能发送给托管式嵌入服务。将索引保留在本机,既能搜索这些文档,也不会产生按查询计费的 API 成本。
|
|
127
|
+
|
|
128
|
+
单纯依赖语义搜索,可能会漏掉技术文档中重要的精确标识符。关键词重排可以保留这些精确匹配,同时继续利用自然语言检索。
|
|
129
|
+
|
|
130
|
+
## 支持的内容
|
|
131
|
+
|
|
132
|
+
| 输入 | 导入方式 |
|
|
133
|
+
|---|---|
|
|
134
|
+
| PDF、DOCX、TXT、Markdown | 导入文件或同步目录 |
|
|
135
|
+
| 客户端已获取的 HTML | 使用 `ingest_data`;通过 Readability 清理后转换为 Markdown |
|
|
136
|
+
| 内存中的纯文本或 Markdown | 使用 `ingest_data`,并提供稳定的来源标识符 |
|
|
137
|
+
|
|
138
|
+
服务器本身不负责获取 HTML。MCP 客户端可以先获取网页,再将 HTML 传给 `ingest_data`。
|
|
139
|
+
|
|
140
|
+
文件导入不支持 Excel、PowerPoint、独立图片和源代码文件扩展名。PDF 可以选择使用本地视觉模型描述图像内容,但该功能不属于 OCR 或图片搜索。
|
|
141
|
+
|
|
142
|
+
## MCP 工具
|
|
143
|
+
|
|
144
|
+
| 工具 | 用途 |
|
|
145
|
+
|---|---|
|
|
146
|
+
| `sync_start` | 将全部已配置根目录或指定路径与索引同步 |
|
|
147
|
+
| `sync_status` | 查询正在运行的同步任务 |
|
|
148
|
+
| `ingest_file` | 导入或替换单个文件 |
|
|
149
|
+
| `ingest_data` | 导入客户端已有的文本、Markdown 或 HTML |
|
|
150
|
+
| `query_documents` | 使用语义匹配和关键词加权进行搜索 |
|
|
151
|
+
| `read_chunk_neighbors` | 读取搜索结果相邻的文本块 |
|
|
152
|
+
| `list_files` | 显示支持的文件及其导入状态 |
|
|
153
|
+
| `delete_file` | 删除已建立索引的文件或 `ingest_data` 条目 |
|
|
154
|
+
| `status` | 显示索引和搜索状态 |
|
|
155
|
+
|
|
156
|
+
### 同步文档根目录
|
|
157
|
+
|
|
158
|
+
`sync_start` 会导入新增和已修改的文件,跳过字节完全相同的文件,并删除已不存在文件的索引记录:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
同步已配置文档根目录中的所有内容,并等待完成。
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
该工具会立即返回 `jobId`。客户端应持续查询 `sync_status`,直到状态变为 `succeeded` 或 `failed`。同步期间不使用视觉模式;发生变化的 PDF 会按文本导入。
|
|
165
|
+
|
|
166
|
+
服务器进程只保留一个同步任务记录。新任务会替换已经结束的记录,服务器重启后该记录也会丢失。
|
|
167
|
+
|
|
168
|
+
### 导入单个文件
|
|
169
|
+
|
|
170
|
+
`ingest_file` 支持 PDF、DOCX、TXT 和 Markdown。通过 MCP 传入的文件路径必须是绝对路径,并且必须位于已配置的文档根目录内:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
导入 /Users/me/docs/api-spec.pdf。
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
再次导入同一路径会替换原有文本块。
|
|
177
|
+
|
|
178
|
+
### 搜索并读取更多上下文
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
API 文档如何说明身份验证?
|
|
182
|
+
查找 ERR_CONNECTION_REFUSED 的文档说明。
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
搜索结果包含文本、来源路径、标题、文本块编号和相关度分数。需要更多上下文时,将结果中的 `chunkIndex` 以及 `filePath` 或 `source` 传给 `read_chunk_neighbors`:
|
|
186
|
+
|
|
187
|
+
```text
|
|
188
|
+
读取该身份验证结果前后的文本块。
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
`query_documents` 和 `list_files` 都接受可选的绝对 `scope` 路径前缀或前缀列表。前缀会匹配指定路径及其全部子路径。
|
|
192
|
+
|
|
193
|
+
### 导入 HTML
|
|
194
|
+
|
|
195
|
+
由 MCP 客户端获取网页后,再使用 `ingest_data`:
|
|
196
|
+
|
|
197
|
+
```text
|
|
198
|
+
获取 https://example.com/docs 并导入其中的 HTML。
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
服务器会提取正文、转换为 Markdown,并使用提供的来源标识符保存。再次使用同一来源会更新已有内容。
|
|
202
|
+
|
|
203
|
+
为外部内容建立索引时,请遵守来源网站的条款和版权规定。
|
|
204
|
+
|
|
205
|
+
### PDF 图像
|
|
206
|
+
|
|
207
|
+
视觉模式会为图像内容较多的 PDF 页面生成说明文字。该功能需要主动开启,常规导入不会加载视觉模型。
|
|
208
|
+
|
|
209
|
+
```text
|
|
210
|
+
使用 visual: true 导入 /Users/me/docs/research-paper.pdf。
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
npx mcp-local-rag ingest ./docs/research-paper.pdf --visual
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
| 模式 | 模型缓存 | 适用场景 |
|
|
218
|
+
|---|---:|---|
|
|
219
|
+
| `fast`(默认) | 约 250 MB | 轻量视觉索引 |
|
|
220
|
+
| `quality` | 约 2.9 GB | 包含标签、标注或其他图中文字的图像 |
|
|
221
|
+
|
|
222
|
+
通过 MCP 使用 `visualQuality: "quality"`,或通过 CLI 使用 `--visual-quality quality`,即可选择较大的模型。实测 CPU 推理耗时约为 `fast` 的两倍,但实际结果取决于硬件和模型更新。
|
|
223
|
+
|
|
224
|
+
生成的说明文字只是辅助文本,并非忠实的逐字转录。检索到的说明文字和文档文本都应视为不可信输入,而不是操作指令。
|
|
225
|
+
|
|
226
|
+
## CLI
|
|
227
|
+
|
|
228
|
+
CLI 无需 MCP 客户端,使用与服务器相同的解析器、嵌入器和向量存储:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
npx mcp-local-rag ingest ./docs/
|
|
232
|
+
npx mcp-local-rag sync ./docs/
|
|
233
|
+
npx mcp-local-rag query "身份验证 API"
|
|
234
|
+
npx mcp-local-rag query "身份验证" --scope /docs/api --scope /docs/guide
|
|
235
|
+
npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5
|
|
236
|
+
npx mcp-local-rag list
|
|
237
|
+
npx mcp-local-rag status
|
|
238
|
+
npx mcp-local-rag delete ./docs/old.pdf
|
|
239
|
+
npx mcp-local-rag delete --source "https://example.com/docs"
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`--db-path`、`--cache-dir` 和 `--model-name` 等全局选项应放在子命令之前,子命令选项则放在子命令之后:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npx mcp-local-rag --db-path ./my-db query "身份验证"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
运行 `npx mcp-local-rag --help` 可查看完整命令说明。
|
|
249
|
+
|
|
250
|
+
CLI 不读取 MCP 客户端配置。如果两个接口需要共用索引,请设置相同的环境变量或命令行参数。特别是共享同一数据库时,`MODEL_NAME` 必须与 CLI 的 `--model-name` 一致。
|
|
251
|
+
|
|
252
|
+
## 搜索调优
|
|
253
|
+
|
|
254
|
+
关键词加权默认开启。对于需要更严格筛选结果的语料库,还可以使用相关度间隔分组、距离过滤和文件数量限制。
|
|
255
|
+
|
|
256
|
+
| 变量 | 默认值 | 说明 |
|
|
257
|
+
|----------|---------|-------------|
|
|
258
|
+
| `RAG_HYBRID_WEIGHT` | `0.6` | 关键词加权系数(0.0–1.0)。0 表示禁用关键词重排,1 表示使用最大加权。 |
|
|
259
|
+
| `RAG_GROUPING` | 未设置 | `similar` 保留第一个相关度分组;`related` 最多保留两个分组,并以明显的向量距离间隔为边界。 |
|
|
260
|
+
| `RAG_MAX_DISTANCE` | 未设置 | 过滤相关度较低的结果(例如 `0.5`)。 |
|
|
261
|
+
| `RAG_MAX_FILES` | 未设置 | 将结果限制在排名最靠前的 N 个文件中(例如 `1` 表示只保留最佳文件)。 |
|
|
262
|
+
|
|
263
|
+
对于包含大量标识符的 API 规范及类似文档,提高关键词权重可以改善精确术语的排名:
|
|
264
|
+
|
|
265
|
+
```json
|
|
266
|
+
"env": {
|
|
267
|
+
"RAG_HYBRID_WEIGHT": "0.7"
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
- `0.7`:比默认值稍强的精确术语重排
|
|
272
|
+
- `1.0`:最大关键词加权
|
|
273
|
+
|
|
274
|
+
## 工作原理
|
|
275
|
+
|
|
276
|
+
导入时:
|
|
277
|
+
|
|
278
|
+
1. 解析器从输入格式中提取文本。
|
|
279
|
+
2. 语义分块器识别主题边界,并保持 Markdown 代码块完整。
|
|
280
|
+
3. Transformers.js 在本地生成嵌入向量。
|
|
281
|
+
4. LanceDB 保存文本块、元数据、向量和全文索引。
|
|
282
|
+
|
|
283
|
+
搜索时:
|
|
284
|
+
|
|
285
|
+
1. 使用同一模型为查询生成嵌入向量。
|
|
286
|
+
2. 向量搜索检索语义相关的文本块。
|
|
287
|
+
3. 配置后,可使用距离过滤和相关度分组进一步缩小候选范围。
|
|
288
|
+
4. 全文匹配会提高精确查询词的排名。
|
|
289
|
+
|
|
290
|
+
## Agent Skills
|
|
291
|
+
|
|
292
|
+
[Agent Skills](https://agentskills.io/) 为 AI 助手提供查询和导入指导:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
npx mcp-local-rag skills install --claude-code
|
|
296
|
+
npx mcp-local-rag skills install --claude-code --global
|
|
297
|
+
npx mcp-local-rag skills install --codex
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
安装的技能涵盖查询写法、结果优化和 HTML 导入。如果技能没有自动启用,请明确要求助手使用 mcp-local-rag 技能。
|
|
301
|
+
|
|
302
|
+
## 配置
|
|
303
|
+
|
|
304
|
+
MCP 服务器读取环境变量。CLI 支持相同的变量和下表所列的命令行参数;命令行参数优先级更高。
|
|
305
|
+
|
|
306
|
+
| 环境变量 | CLI 参数 | 默认值 | 说明 |
|
|
307
|
+
|---------------------|----------|---------|-------------|
|
|
308
|
+
| `BASE_DIR` | `--base-dir` | 当前目录 | 一个文档根目录;`ingest`、`list` 和 `sync` 可重复使用该 CLI 参数 |
|
|
309
|
+
| `BASE_DIRS` | 不适用 | 未设置 | 文档根目录的 JSON 数组;优先于 `BASE_DIR` |
|
|
310
|
+
| `DB_PATH` | `--db-path` | `./lancedb/` | 向量数据库位置 |
|
|
311
|
+
| `CACHE_DIR` | `--cache-dir` | `./models/` | 模型缓存目录 |
|
|
312
|
+
| `MODEL_NAME` | `--model-name` | `Xenova/all-MiniLM-L6-v2` | Hugging Face 嵌入模型 |
|
|
313
|
+
| `MAX_FILE_SIZE` | `--max-file-size` | `104857600`(100 MB) | 最大文件大小(字节) |
|
|
314
|
+
| `CHUNK_MIN_LENGTH` | `--chunk-min-length` | `50` | 文本块最小字符数(1–10000) |
|
|
315
|
+
| `RAG_DEVICE` | 不适用 | `cpu` | ONNX Runtime 执行设备 |
|
|
316
|
+
| `RAG_DTYPE` | 不适用 | `fp32` | 传给所选模型的嵌入数据类型 |
|
|
317
|
+
|
|
318
|
+
### 文档根目录(`BASE_DIR` 和 `BASE_DIRS`)
|
|
319
|
+
|
|
320
|
+
mcp-local-rag 只允许在已配置的根目录中执行文件操作。需要使用多个根目录时,`BASE_DIRS` 必须是由非空路径组成的 JSON 数组:
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
export BASE_DIRS='["/Users/me/Documents/work","/Users/me/Projects/specs"]'
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
根目录配置按以下优先顺序解析:
|
|
327
|
+
|
|
328
|
+
1. CLI 的 `--base-dir <path>` 参数(可在 `ingest`、`list` 和 `sync` 中重复使用)
|
|
329
|
+
2. `BASE_DIRS`
|
|
330
|
+
3. `BASE_DIR`
|
|
331
|
+
4. 当前目录
|
|
332
|
+
|
|
333
|
+
每一级配置都会完全取代优先级更低的配置,而不是与其合并。无效的 `BASE_DIRS` 会直接报错,不会回退到 `BASE_DIR` 或当前目录。即使配置有误,MCP 中的 `status` 仍然可用,因此客户端可以报告具体问题。
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
npx mcp-local-rag ingest --base-dir /Users/me/work --base-dir /Users/me/specs /Users/me/work/readme.md
|
|
337
|
+
npx mcp-local-rag list --base-dir /Users/me/work --base-dir /Users/me/specs
|
|
338
|
+
npx mcp-local-rag sync --base-dir /Users/me/work --base-dir /Users/me/specs
|
|
339
|
+
BASE_DIRS='["/Users/me/work","/Users/me/specs"]' npx mcp-local-rag list
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### 存储和模型
|
|
343
|
+
|
|
344
|
+
`DB_PATH` 和 `CACHE_DIR` 默认相对于进程的工作目录。如果 MCP 客户端可能从不同的项目目录启动服务器,请使用绝对路径。
|
|
345
|
+
|
|
346
|
+
设置 `MODEL_NAME` 或传入 `--model-name`,即可选择适合文档语言和领域的 Hugging Face 嵌入模型。
|
|
347
|
+
|
|
348
|
+
mcp-local-rag 使用平均池化和 L2 归一化生成嵌入。选择模型时,请确认这些设置是否符合该模型建议的推理方式,因为池化方式可能影响检索质量。
|
|
349
|
+
|
|
350
|
+
更改 `MODEL_NAME`、`RAG_DEVICE` 或 `RAG_DTYPE` 可能导致现有向量不兼容。更改嵌入配置后,请使用新的 `DB_PATH`,或者删除现有索引并重新导入。
|
|
351
|
+
|
|
352
|
+
适用于中文文档的模型示例:`Xenova/bge-small-zh-v1.5`。
|
|
353
|
+
|
|
354
|
+
## 安全与运行
|
|
355
|
+
|
|
356
|
+
- 文件访问仅限 `BASE_DIR`、`BASE_DIRS` 或 CLI 的 `--base-dir` 所指定的根目录。
|
|
357
|
+
- 指向所有已配置根目录之外的符号链接会被拒绝。
|
|
358
|
+
- 所需模型缓存完成后,文档处理和搜索不会再发起网络请求。
|
|
359
|
+
- 服务器面向单个本地用户设计,不提供身份验证或访问控制。
|
|
360
|
+
- 不要让多个 CLI 或 MCP 写入进程同时操作同一个 `DB_PATH`。同步进行时仍可执行只读查询。
|
|
361
|
+
- 没有写入进程运行时,可以复制 `DB_PATH` 目录来备份索引。
|
|
362
|
+
|
|
363
|
+
<details>
|
|
364
|
+
<summary><strong>故障排除</strong></summary>
|
|
365
|
+
|
|
366
|
+
### "No results found"
|
|
367
|
+
|
|
368
|
+
必须先导入文档。运行 `"列出所有已导入的文件"` 检查导入状态。
|
|
369
|
+
|
|
370
|
+
### 模型下载失败
|
|
371
|
+
|
|
372
|
+
请检查网络连接。如果使用代理,请确认网络设置。也可以[手动下载模型](https://huggingface.co/Xenova/all-MiniLM-L6-v2)。
|
|
373
|
+
|
|
374
|
+
### "File too large"
|
|
375
|
+
|
|
376
|
+
默认上限为 100 MB。请拆分大文件,或提高 `MAX_FILE_SIZE`。
|
|
377
|
+
|
|
378
|
+
### 查询缓慢
|
|
379
|
+
|
|
380
|
+
使用 `status` 查看文本块数量。包含大量文本块的大型文档可能降低查询速度,可以考虑拆分特别大的文件。
|
|
381
|
+
|
|
382
|
+
### "Path outside BASE_DIR"
|
|
383
|
+
|
|
384
|
+
请确保文件路径位于某个已配置根目录内,即 `BASE_DIR`、`BASE_DIRS` 中的任一路径或 CLI 的任一 `--base-dir`。请使用绝对路径。
|
|
385
|
+
|
|
386
|
+
### "BASE_DIRS must be a JSON array..."
|
|
387
|
+
|
|
388
|
+
`BASE_DIRS` 接受由一个或多个非空路径组成的 JSON 数组:
|
|
389
|
+
|
|
390
|
+
- 有效:`BASE_DIRS='["/Users/me/work","/Users/me/specs"]'`
|
|
391
|
+
- 无效:`BASE_DIRS=/a:/b`(不支持分隔符语法)
|
|
392
|
+
- 无效:`BASE_DIRS='[]'`(空数组)
|
|
393
|
+
|
|
394
|
+
### MCP 客户端未显示工具
|
|
395
|
+
|
|
396
|
+
1. 检查配置文件语法
|
|
397
|
+
2. 完全退出并重启客户端(Cursor 在 Mac 上使用 Cmd+Q)
|
|
398
|
+
3. 直接测试:`npx mcp-local-rag` 应能正常运行且不报错
|
|
399
|
+
|
|
400
|
+
</details>
|
|
401
|
+
|
|
402
|
+
## 参与贡献
|
|
403
|
+
|
|
404
|
+
欢迎贡献!环境设置和贡献规范请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
|
|
405
|
+
|
|
406
|
+
## 许可证
|
|
407
|
+
|
|
408
|
+
MIT 许可证,可免费用于个人和商业用途。
|
|
409
|
+
|
|
410
|
+
## 博客文章
|
|
411
|
+
|
|
412
|
+
- [为 Agentic Coding 构建本地 RAG](https://www.norsica.jp/blog/local-rag-agentic-coding):深入介绍语义分块与混合搜索的技术设计。
|
|
413
|
+
|
|
414
|
+
## 致谢
|
|
415
|
+
|
|
416
|
+
本项目基于 Anthropic 的 [Model Context Protocol](https://modelcontextprotocol.io/)、[LanceDB](https://lancedb.com/) 和 [Transformers.js](https://huggingface.co/docs/transformers.js) 构建。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Local RAG Skills Installer
|
|
3
|
+
*
|
|
4
|
+
* Installs skills to various AI coding assistants:
|
|
5
|
+
* - Claude Code (project or global)
|
|
6
|
+
* - OpenAI Codex
|
|
7
|
+
* - Custom path
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* npx mcp-local-rag skills install --claude-code # Project-level
|
|
11
|
+
* npx mcp-local-rag skills install --claude-code --global # User-level
|
|
12
|
+
* npx mcp-local-rag skills install --codex # Codex
|
|
13
|
+
* npx mcp-local-rag skills install --path /custom/path # Custom
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Run the skills installer with the given arguments
|
|
17
|
+
* @param args - Command line arguments (after "skills install")
|
|
18
|
+
*/
|
|
19
|
+
export declare function run(args: string[]): void;
|
|
20
|
+
//# sourceMappingURL=install-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.d.ts","sourceRoot":"","sources":["../../src/bin/install-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqLH;;;GAGG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+BxC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Local RAG Skills Installer
|
|
3
|
+
*
|
|
4
|
+
* Installs skills to various AI coding assistants:
|
|
5
|
+
* - Claude Code (project or global)
|
|
6
|
+
* - OpenAI Codex
|
|
7
|
+
* - Custom path
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* npx mcp-local-rag skills install --claude-code # Project-level
|
|
11
|
+
* npx mcp-local-rag skills install --claude-code --global # User-level
|
|
12
|
+
* npx mcp-local-rag skills install --codex # Codex
|
|
13
|
+
* npx mcp-local-rag skills install --path /custom/path # Custom
|
|
14
|
+
*/
|
|
15
|
+
import { cpSync, existsSync, mkdirSync } from 'node:fs';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { dirname, join, resolve } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
// ============================================
|
|
20
|
+
// Constants
|
|
21
|
+
// ============================================
|
|
22
|
+
// Skills source directory (relative to dist/bin when compiled)
|
|
23
|
+
// dist/bin/install-skills.js -> dist/skills/mcp-local-rag
|
|
24
|
+
// But skills are actually in package root: skills/mcp-local-rag
|
|
25
|
+
// So from dist/bin, go up twice: ../.. then skills/mcp-local-rag
|
|
26
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
27
|
+
const SKILLS_SOURCE = resolve(__dirname, '..', '..', 'skills', 'mcp-local-rag');
|
|
28
|
+
// Codex home directory (supports CODEX_HOME environment variable)
|
|
29
|
+
// https://developers.openai.com/codex/local-config/
|
|
30
|
+
const CODEX_HOME = process.env['CODEX_HOME'] || join(homedir(), '.codex');
|
|
31
|
+
// Installation targets
|
|
32
|
+
const TARGETS = {
|
|
33
|
+
'claude-code-project': './.claude/skills/mcp-local-rag',
|
|
34
|
+
'claude-code-global': join(homedir(), '.claude', 'skills', 'mcp-local-rag'),
|
|
35
|
+
'codex-project': './.codex/skills/mcp-local-rag',
|
|
36
|
+
'codex-global': join(CODEX_HOME, 'skills', 'mcp-local-rag'),
|
|
37
|
+
};
|
|
38
|
+
function parseArgs(args) {
|
|
39
|
+
const options = {
|
|
40
|
+
target: 'claude-code-project',
|
|
41
|
+
help: false,
|
|
42
|
+
};
|
|
43
|
+
for (let i = 0; i < args.length; i++) {
|
|
44
|
+
const arg = args[i];
|
|
45
|
+
switch (arg) {
|
|
46
|
+
case '--help':
|
|
47
|
+
case '-h':
|
|
48
|
+
options.help = true;
|
|
49
|
+
break;
|
|
50
|
+
case '--claude-code':
|
|
51
|
+
// Check for --global flag
|
|
52
|
+
if (args[i + 1] === '--global') {
|
|
53
|
+
options.target = 'claude-code-global';
|
|
54
|
+
i++; // Skip next arg
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
options.target = 'claude-code-project';
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case '--codex':
|
|
61
|
+
// Check for --project or --global flag
|
|
62
|
+
if (args[i + 1] === '--project') {
|
|
63
|
+
options.target = 'codex-project';
|
|
64
|
+
i++; // Skip next arg
|
|
65
|
+
}
|
|
66
|
+
else if (args[i + 1] === '--global') {
|
|
67
|
+
options.target = 'codex-global';
|
|
68
|
+
i++; // Skip next arg
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Default to global (matches previous behavior)
|
|
72
|
+
options.target = 'codex-global';
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
case '--path': {
|
|
76
|
+
const pathArg = args[i + 1];
|
|
77
|
+
if (!pathArg) {
|
|
78
|
+
console.error('Error: --path requires a path argument');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
options.target = 'custom';
|
|
82
|
+
options.customPath = pathArg;
|
|
83
|
+
i++; // Skip next arg
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
default:
|
|
87
|
+
if (arg?.startsWith('-')) {
|
|
88
|
+
console.error(`Unknown option: ${arg}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return options;
|
|
94
|
+
}
|
|
95
|
+
// ============================================
|
|
96
|
+
// Help Message
|
|
97
|
+
// ============================================
|
|
98
|
+
function printHelp() {
|
|
99
|
+
console.log(`
|
|
100
|
+
MCP Local RAG Skills Installer
|
|
101
|
+
|
|
102
|
+
Usage:
|
|
103
|
+
npx mcp-local-rag skills install [options]
|
|
104
|
+
|
|
105
|
+
Options:
|
|
106
|
+
--claude-code Install to project-level Claude Code skills
|
|
107
|
+
(./.claude/skills/)
|
|
108
|
+
|
|
109
|
+
--claude-code --global Install to user-level Claude Code skills
|
|
110
|
+
(~/.claude/skills/)
|
|
111
|
+
|
|
112
|
+
--codex Install to user-level Codex skills (default)
|
|
113
|
+
($CODEX_HOME/skills/ or ~/.codex/skills/)
|
|
114
|
+
|
|
115
|
+
--codex --project Install to project-level Codex skills
|
|
116
|
+
(./.codex/skills/)
|
|
117
|
+
|
|
118
|
+
--codex --global Install to user-level Codex skills
|
|
119
|
+
($CODEX_HOME/skills/ or ~/.codex/skills/)
|
|
120
|
+
|
|
121
|
+
--path <path> Install to custom path
|
|
122
|
+
|
|
123
|
+
--help, -h Show this help message
|
|
124
|
+
|
|
125
|
+
Examples:
|
|
126
|
+
npx mcp-local-rag skills install --claude-code
|
|
127
|
+
npx mcp-local-rag skills install --claude-code --global
|
|
128
|
+
npx mcp-local-rag skills install --codex
|
|
129
|
+
npx mcp-local-rag skills install --codex --project
|
|
130
|
+
npx mcp-local-rag skills install --path ./my-skills/
|
|
131
|
+
`);
|
|
132
|
+
}
|
|
133
|
+
// ============================================
|
|
134
|
+
// Installation
|
|
135
|
+
// ============================================
|
|
136
|
+
function getTargetPath(options) {
|
|
137
|
+
if (options.target === 'custom') {
|
|
138
|
+
if (!options.customPath) {
|
|
139
|
+
console.error('Error: Custom path not specified');
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
return resolve(options.customPath, 'mcp-local-rag');
|
|
143
|
+
}
|
|
144
|
+
return TARGETS[options.target];
|
|
145
|
+
}
|
|
146
|
+
function install(targetPath) {
|
|
147
|
+
// Check source exists
|
|
148
|
+
if (!existsSync(SKILLS_SOURCE)) {
|
|
149
|
+
console.error(`Error: Skills source not found at ${SKILLS_SOURCE}`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
// Create target directory
|
|
153
|
+
const targetDir = dirname(targetPath);
|
|
154
|
+
if (!existsSync(targetDir)) {
|
|
155
|
+
mkdirSync(targetDir, { recursive: true });
|
|
156
|
+
console.log(`Created directory: ${targetDir}`);
|
|
157
|
+
}
|
|
158
|
+
// Copy skills
|
|
159
|
+
cpSync(SKILLS_SOURCE, targetPath, { recursive: true });
|
|
160
|
+
console.log(`Installed skills to: ${targetPath}`);
|
|
161
|
+
}
|
|
162
|
+
// ============================================
|
|
163
|
+
// Exported Run Function
|
|
164
|
+
// ============================================
|
|
165
|
+
/**
|
|
166
|
+
* Run the skills installer with the given arguments
|
|
167
|
+
* @param args - Command line arguments (after "skills install")
|
|
168
|
+
*/
|
|
169
|
+
export function run(args) {
|
|
170
|
+
// Default to help if no args
|
|
171
|
+
if (args.length === 0) {
|
|
172
|
+
printHelp();
|
|
173
|
+
process.exit(0);
|
|
174
|
+
}
|
|
175
|
+
const options = parseArgs(args);
|
|
176
|
+
if (options.help) {
|
|
177
|
+
printHelp();
|
|
178
|
+
process.exit(0);
|
|
179
|
+
}
|
|
180
|
+
const targetPath = getTargetPath(options);
|
|
181
|
+
console.log('Installing MCP Local RAG skills...');
|
|
182
|
+
console.log(`Target: ${options.target}`);
|
|
183
|
+
console.log(`Path: ${targetPath}`);
|
|
184
|
+
console.log();
|
|
185
|
+
install(targetPath);
|
|
186
|
+
console.log();
|
|
187
|
+
console.log('Installation complete!');
|
|
188
|
+
console.log();
|
|
189
|
+
console.log('The following skills are now available:');
|
|
190
|
+
console.log(' - mcp-local-rag (SKILL.md)');
|
|
191
|
+
console.log(' - references/html-ingestion.md');
|
|
192
|
+
console.log(' - references/query-optimization.md');
|
|
193
|
+
console.log(' - references/result-refinement.md');
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=install-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/bin/install-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indivisible UTF-16 text range in the source passed to semantic chunking.
|
|
3
|
+
*/
|
|
4
|
+
export interface AtomicTextRange {
|
|
5
|
+
/** Inclusive UTF-16 offset. */
|
|
6
|
+
start: number;
|
|
7
|
+
/** Exclusive UTF-16 offset. */
|
|
8
|
+
end: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Text chunk
|
|
12
|
+
*/
|
|
13
|
+
export interface TextChunk {
|
|
14
|
+
/** Chunk text */
|
|
15
|
+
text: string;
|
|
16
|
+
/** Chunk index (zero-based) */
|
|
17
|
+
index: number;
|
|
18
|
+
/** Inclusive UTF-16 offset in the source document. */
|
|
19
|
+
sourceStart: number;
|
|
20
|
+
/** Exclusive UTF-16 offset in the source document. */
|
|
21
|
+
sourceEnd: number;
|
|
22
|
+
}
|
|
23
|
+
export { DEFAULT_MIN_CHUNK_LENGTH, SemanticChunker } from './semantic-chunker.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
|