xtc-app-knowledge-mcp 0.1.0__tar.gz
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.
- xtc_app_knowledge_mcp-0.1.0/PKG-INFO +9 -0
- xtc_app_knowledge_mcp-0.1.0/README.md +279 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/__init__.py +0 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/__main__.py +4 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/cli.py +50 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/cloud_client.py +387 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/frontmatter.py +50 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/installer.py +529 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/local_embedding.py +177 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/local_search.py +228 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/server.py +957 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-doc-format-rewrite/SKILL.md +197 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-doc-format-rewrite/eval.yaml +670 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-doc-format-rewrite/prompt.md +550 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/SKILL.md +349 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/architecture-lens-design.md +249 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/card-generator-design.md +178 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/card-splitter-design.md +158 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/knowledge-lifecycle-design.md +342 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/knowledge-wiki-design.md +367 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/architecture-lens.md +289 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/artifact-validator.md +89 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/card-generator.md +114 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/card-splitter.md +217 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/impact-analyzer.md +164 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/wiki-analyzer.md +134 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/scripts/generate-wiki.py +293 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/scripts/validate-mermaid.py +65 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/architecture-overview.template.md +80 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/impact-report.template.md +75 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/knowledge-graph-structure.md +187 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/module-source-manifest.template.md +78 -0
- xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/summary.template.md +21 -0
- xtc_app_knowledge_mcp-0.1.0/pyproject.toml +24 -0
- xtc_app_knowledge_mcp-0.1.0/setup.cfg +4 -0
- xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/PKG-INFO +9 -0
- xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/SOURCES.txt +39 -0
- xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/dependency_links.txt +1 -0
- xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/entry_points.txt +2 -0
- xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/requires.txt +4 -0
- xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: xtc-app-knowledge-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Local MCP aggregator that merges local + cloud knowledge search. 聚合 MCP 本地网关。
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Requires-Dist: fastmcp>=0.1.0
|
|
7
|
+
Requires-Dist: fastembed>=0.5.0
|
|
8
|
+
Requires-Dist: httpx>=0.27.0
|
|
9
|
+
Requires-Dist: pyyaml>=6.0
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# app-knowledge-mcp — 聚合 MCP
|
|
2
|
+
|
|
3
|
+
聚合云端知识库与本地 `local_knowledge/` 的统一 MCP 网关。云端能力全部平替 [xtc_knowledge_engine](http://172.28.1.116:9999/App/xtc_knowledge_engine),同时新增本地语义检索。
|
|
4
|
+
|
|
5
|
+
## 与云端 MCP 的异同
|
|
6
|
+
|
|
7
|
+
| 维度 | 云端 MCP (xtc_knowledge_engine) | 聚合 MCP (本项目) |
|
|
8
|
+
|------|-------------------------------|-------------------|
|
|
9
|
+
| 架构 | Gateway → 3 微服务 (retrieval/rule/skill) | FastMCP stdio 本地进程 |
|
|
10
|
+
| 知识检索 | FTS5 + 同义词扩展,直连 retrieval:18001 | 并行直连 retrieval + skill,逻辑完全一致 |
|
|
11
|
+
| Skill 检索 | triggers 打分,直连 skill:18003 | 同上 |
|
|
12
|
+
| 规则校验 | K2 关键词匹配,直连 rule:18002 | 代理云端 MCP |
|
|
13
|
+
| 知识同步 | profile 匹配,直连 retrieval:18001 | 代理云端 MCP |
|
|
14
|
+
| 本地检索 | ❌ 无 | ✅ 词法 OR + bge-small-zh-v1.5 语义 embedding |
|
|
15
|
+
| 内置模型 | ❌ 无 | ✅ 90MB ONNX,零下载 |
|
|
16
|
+
| 工具数量 | 4 个(search/skill_get/rule_check/knowledge_sync) | 9 个(+ cloud_search/local_search/knowledge_get/local_read 等) |
|
|
17
|
+
| 获取全文 | 脚本 `fetch_doc.py` → 读缓存 | MCP 工具 `knowledge_get(doc_id)` 直接返回 |
|
|
18
|
+
| Skill 文件 | `fetch_doc.py --skill-id` 两步 | `skill_get(include_prompt=True)` 一步并行 |
|
|
19
|
+
| 平台命令 | 无 | `/k-search` 双检索命令(OpenCode / Claude Code / Cursor) |
|
|
20
|
+
| 安装方式 | 脚本拷贝 → pip install | `python3 knowledge-mcp.py` 跨平台,pip install -e 可编辑模式 |
|
|
21
|
+
| 传输方式 | streamable-http (:18000) | stdio 本地进程 |
|
|
22
|
+
| 安装模式 | — | `pip install -e` 可编辑模式,改源码即时生效,无需重装 |
|
|
23
|
+
|
|
24
|
+
**在线时效果一致**,聚合 MCP 的云端能力完全平替云端 MCP。离线时聚合 MCP 保留本地检索。
|
|
25
|
+
|
|
26
|
+
## 工具清单
|
|
27
|
+
|
|
28
|
+
### 云端工具(5 个)
|
|
29
|
+
|
|
30
|
+
| 工具 | 触发时机 | 说明 |
|
|
31
|
+
|------|---------|------|
|
|
32
|
+
| `cloud_search` | 每次知识检索必须调用 | 并行直连 retrieval + skill,返回知识文档 + Skill 候选 |
|
|
33
|
+
| `skill_get` | search 返回 skill_id 后 | 获取 Skill 详情,include_prompt 时并行拉取全量文件 |
|
|
34
|
+
| `rule_check` | 每次代码修改完成后 | 对 diff 进行 K2/K5/K7 编码规范校验 |
|
|
35
|
+
| `knowledge_sync` | 本地缓存缺失或过期时 | 按 profile 批量同步云端知识文档 |
|
|
36
|
+
| `knowledge_get` | search 返回云端 doc_id 后 | 获取云端知识文档全文 |
|
|
37
|
+
|
|
38
|
+
### 本地工具(4 个)
|
|
39
|
+
|
|
40
|
+
| 工具 | 触发时机 | 说明 |
|
|
41
|
+
|------|---------|------|
|
|
42
|
+
| `local_search` | 每次知识检索必须调用 | 词法 OR + bge-small-zh-v1.5 语义混合检索 |
|
|
43
|
+
| `local_read` | local_search 返回 file_path 后 | 读取本地文件全文 |
|
|
44
|
+
| `local_list_domains` | 了解本地域覆盖时 | 列出 `local_knowledge/` 下所有业务域及概览 |
|
|
45
|
+
| `local_list_files` | 浏览本地文件时 | 列出所有知识文件路径 |
|
|
46
|
+
|
|
47
|
+
## 调用规则
|
|
48
|
+
|
|
49
|
+
**每次知识检索必须同时调用 `cloud_search` + `local_search`**。LLM 通过 `instructions` 和 `/k-search` 命令双重保障。
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
cloud_search(query, ...) + local_search(query)
|
|
53
|
+
→ 查看元信息 → 判断相关性
|
|
54
|
+
→ knowledge_get(doc_id) 获取云端全文
|
|
55
|
+
→ local_read(path) 获取本地全文
|
|
56
|
+
→ skill_get → rule_check → 重复直到 passed
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 架构
|
|
60
|
+
|
|
61
|
+
```mermaid
|
|
62
|
+
flowchart TB
|
|
63
|
+
subgraph USER["用户 / LLM"]
|
|
64
|
+
CMD["/k-search 命令"]
|
|
65
|
+
INS["instructions(云端+本地描述)"]
|
|
66
|
+
TOOLS["tools/list(9 个工具)"]
|
|
67
|
+
CMD --> LLM["LLM 触发"]
|
|
68
|
+
INS --> LLM
|
|
69
|
+
TOOLS --> LLM
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
subgraph GATEWAY["knowledge-gateway · FastMCP stdio"]
|
|
73
|
+
MW["LoggingMiddleware"]
|
|
74
|
+
MW --> LOG["→ .knowledge/logs/mcp-calls.log"]
|
|
75
|
+
|
|
76
|
+
subgraph CLOUD_TOOLS["云端工具(5 个)"]
|
|
77
|
+
CS["cloud_search(query, platform, domain, ...)"]
|
|
78
|
+
SG["skill_get(skill_id, include_prompt)"]
|
|
79
|
+
RC["rule_check(content, rule_types)"]
|
|
80
|
+
KS["knowledge_sync(repo_id, profile)"]
|
|
81
|
+
KG["knowledge_get(doc_id)"]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
subgraph LOCAL_TOOLS["本地工具(4 个)"]
|
|
85
|
+
LS["local_search(query, query_domains?)"]
|
|
86
|
+
LR["local_read(path)"]
|
|
87
|
+
LD["local_list_domains()"]
|
|
88
|
+
LF["local_list_files()"]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
subgraph RESOURCES["资源(4 个)"]
|
|
92
|
+
R1["knowledge://local/files"]
|
|
93
|
+
R2["knowledge://local/domains"]
|
|
94
|
+
R3["knowledge://local/meta/{path*}"]
|
|
95
|
+
R4["knowledge://local/{path*}"]
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
subgraph CLOUD["云端后端"]
|
|
100
|
+
RET["retrieval :18001/search\nFTS5 · 同义词扩展 · bm25 排序\nmetadata 过滤 · LIKE 兜底"]
|
|
101
|
+
SKL["skill :18003/search\ntriggers 多维打分\nkeywords · filePatterns · changeTypes"]
|
|
102
|
+
DOC["retrieval :18001/doc\nSQLite → GitLab fallback"]
|
|
103
|
+
RUL["rule :18002/check\nK2 关键词匹配"]
|
|
104
|
+
SYNC["retrieval :18001/sync-profile-docs\nprofile 展开 · diff 比对"]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
subgraph LOCAL["本地 local_knowledge/"]
|
|
108
|
+
LEX["词法 OR 召回\nfm 4x · body 1x"]
|
|
109
|
+
SEM["语义召回\nbge-small-zh-v1.5 embedding\ncosine similarity"]
|
|
110
|
+
MERGE["blend 排序\n40% 词法 + 60% 语义\nsem-only ×0.7 discount"]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
LLM -->|"每次必调"| CS
|
|
114
|
+
LLM -->|"每次必调"| LS
|
|
115
|
+
LLM --> SG
|
|
116
|
+
LLM --> RC
|
|
117
|
+
LLM --> KS
|
|
118
|
+
LLM --> KG
|
|
119
|
+
LLM --> LR
|
|
120
|
+
LLM --> LD
|
|
121
|
+
LLM --> LF
|
|
122
|
+
LLM --> R1
|
|
123
|
+
LLM --> R2
|
|
124
|
+
LLM --> R3
|
|
125
|
+
LLM --> R4
|
|
126
|
+
|
|
127
|
+
CS -->|"asyncio.gather 并行"| RET
|
|
128
|
+
CS -->|"return_exceptions=True"| SKL
|
|
129
|
+
KG --> DOC
|
|
130
|
+
RC --> RUL
|
|
131
|
+
KS --> SYNC
|
|
132
|
+
SG -->|"MCP 代理"| SKL
|
|
133
|
+
|
|
134
|
+
LS --> LEX --> MERGE
|
|
135
|
+
LS --> SEM --> MERGE
|
|
136
|
+
|
|
137
|
+
MW --> CS
|
|
138
|
+
MW --> LS
|
|
139
|
+
MW --> KG
|
|
140
|
+
MW --> SG
|
|
141
|
+
MW --> RC
|
|
142
|
+
MW --> KS
|
|
143
|
+
MW --> LR
|
|
144
|
+
MW --> LD
|
|
145
|
+
MW --> LF
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 安装/卸载流程
|
|
149
|
+
|
|
150
|
+
```mermaid
|
|
151
|
+
flowchart LR
|
|
152
|
+
subgraph INSTALL["安装 · python3 knowledge-mcp.py /path/to/project"]
|
|
153
|
+
I1["clone/pull → ~/app-knowledge-mcp-repo/"] --> I2["pip install -e"]
|
|
154
|
+
I2 --> I3["平台检测\nflutter/android/ios/harmonyos"]
|
|
155
|
+
I3 --> I4["创建 .knowledge/profile.yaml"]
|
|
156
|
+
I4 --> I5["部署 dev-toolkit 模板\nlocal_knowledge/dev-toolkit/"]
|
|
157
|
+
I5 --> I6["创建 .opencode/agents/ 软链接"]
|
|
158
|
+
I6 --> I7["创建 .opencode/skills/ 软链接"]
|
|
159
|
+
I7 --> I8["写入 opencode.json"]
|
|
160
|
+
I8 --> I9["写入 .mcp.json"]
|
|
161
|
+
I9 --> I10["写入 .opencode/commands/k-search.md"]
|
|
162
|
+
I10 --> I11["写入 .claude/commands/k-search.md"]
|
|
163
|
+
I11 --> I12["写入 .cursor/rules/mcp-rules.mdc"]
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
subgraph UNINSTALL["卸载 · python3 knowledge-mcp.py --uninstall"]
|
|
167
|
+
U1["pip uninstall app-knowledge-mcp"] --> U2["移除 opencode.json 配置"]
|
|
168
|
+
U2 --> U3["移除 .mcp.json 配置"]
|
|
169
|
+
U3 --> U4["删除 .knowledge/"]
|
|
170
|
+
U4 --> U5["清理 .opencode/agents/ 软链接"]
|
|
171
|
+
U5 --> U6["清理 .opencode/skills/ 软链接"]
|
|
172
|
+
U6 --> U7["删除 .opencode/commands/k-search.md"]
|
|
173
|
+
U7 --> U8["删除 .claude/commands/k-search.md"]
|
|
174
|
+
U8 --> U9["删除 .cursor/rules/mcp-rules.mdc"]
|
|
175
|
+
U9 --> U10["删除 local_knowledge/dev-toolkit/"]
|
|
176
|
+
U10 --> U11["❗ local_knowledge/ 其余内容保留不动"]
|
|
177
|
+
end
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 本地语义检索管线
|
|
181
|
+
|
|
182
|
+
```mermaid
|
|
183
|
+
flowchart TD
|
|
184
|
+
Q["query: '摔倒 SOS'"] --> T["分词: ['摔倒', 'sos']"]
|
|
185
|
+
T --> LEX["词法召回\n扫描 local_knowledge/ 所有 .md"]
|
|
186
|
+
T --> SEM_EMB["语义 embedding\nbge-small-zh-v1.5 → 512d"]
|
|
187
|
+
|
|
188
|
+
LEX --> LEX_MATCH{"关键词命中?"}
|
|
189
|
+
LEX_MATCH -->|"有候选"| CAND["候选列表\nfile_path · name · relevance"]
|
|
190
|
+
LEX_MATCH -->|"无候选"| CAND_EMPTY["candidates = []"]
|
|
191
|
+
|
|
192
|
+
SEM_EMB --> SEM_ALL["全量 cosine similarity\n遍历所有文件"]
|
|
193
|
+
SEM_ALL --> SEM_SCORE["{file_path: similarity}"]
|
|
194
|
+
|
|
195
|
+
CAND --> BLEND["blend 融合\n40% lex_norm + 60% sem"]
|
|
196
|
+
CAND_EMPTY --> SEM_ONLY["纯语义构建\nsem ≥ 0.2 阈值"]
|
|
197
|
+
SEM_SCORE --> BLEND
|
|
198
|
+
SEM_SCORE --> SEM_ONLY
|
|
199
|
+
|
|
200
|
+
BLEND --> SORT["sort by relevance"]
|
|
201
|
+
SEM_ONLY --> SORT
|
|
202
|
+
SORT --> TOPK["top_k 截断 → results"]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
## 快速接入
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# 一键安装
|
|
210
|
+
python3 knowledge-mcp.py /path/to/your-project
|
|
211
|
+
|
|
212
|
+
# 卸载
|
|
213
|
+
python3 knowledge-mcp.py --uninstall /path/to/your-project
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
脚本自动完成:
|
|
217
|
+
1. 从远程克隆/更新仓库到 `~/app-knowledge-mcp-repo/`
|
|
218
|
+
2. `pip install -e` 安装(含 90MB 内置模型)
|
|
219
|
+
3. 检测项目平台(flutter/android/ios/harmonyos)
|
|
220
|
+
4. 创建 `.knowledge/` + `profile.yaml`
|
|
221
|
+
5. 部署 dev-toolkit 模板(Agent + Skill 定义)
|
|
222
|
+
6. 创建 `.opencode/skills/` 软链接 → `local_knowledge/dev-toolkit/skills/<name>/`
|
|
223
|
+
7. 创建 `.opencode/agents/` 软链接 → `.opencode/agents/<name>.yaml`
|
|
224
|
+
8. 写入 OpenCode / Claude Code / Cursor 三平台 MCP 配置
|
|
225
|
+
9. 创建 `/k-search` 命令
|
|
226
|
+
10. 服务启动时预加载 embedding 模型,首次搜索无冷启动延迟
|
|
227
|
+
|
|
228
|
+
## 性能特性
|
|
229
|
+
|
|
230
|
+
- **异步日志**:`_log_call` 通过 `asyncio.Queue` 推送,后台 worker 批量写文件,工具调用不阻塞
|
|
231
|
+
- **文件缓存**:`local_search` 按 mtime+size 缓存文件内容,同会话重复搜索不读盘
|
|
232
|
+
- **语义模型预热**:服务启动时加载 bge-small-zh-v1.5 ONNX 模型,首次搜索免等待
|
|
233
|
+
- **manifest 缓存**:`.knowledge/manifest.json` 带 mtime 校验,避免每次搜索读磁盘
|
|
234
|
+
|
|
235
|
+
## 手动配置
|
|
236
|
+
|
|
237
|
+
`opencode.json`:
|
|
238
|
+
|
|
239
|
+
```json
|
|
240
|
+
{
|
|
241
|
+
"mcp": {
|
|
242
|
+
"knowledge-gateway": {
|
|
243
|
+
"type": "local",
|
|
244
|
+
"command": ["python3", "-m", "app_knowledge_mcp.server"],
|
|
245
|
+
"enabled": true
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## 项目结构
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
app-knowledge-mcp-repo/
|
|
255
|
+
├── app_knowledge_mcp/
|
|
256
|
+
│ ├── __init__.py
|
|
257
|
+
│ ├── server.py # FastMCP 入口,9 工具 + 4 资源 + 异步日志 + _return_timed
|
|
258
|
+
│ ├── cloud_client.py # 云端直连(retrieval+skill 并行 REST)
|
|
259
|
+
│ ├── local_search.py # 词法 OR + 语义 embedding 混合检索(带文件内容缓存)
|
|
260
|
+
│ ├── local_embedding.py # fastembed 封装,bge-small-zh-v1.5(启动预热)
|
|
261
|
+
│ ├── frontmatter.py # YAML frontmatter 解析
|
|
262
|
+
│ ├── models/ # 90MB 内置 ONNX 模型
|
|
263
|
+
│ └── templates/
|
|
264
|
+
│ └── dev-toolkit/ # 部署到项目的 dev-toolkit 模板
|
|
265
|
+
│ ├── agents/ # Agent 定义(lee, kai, nio 等)
|
|
266
|
+
│ └── skills/ # Skill 定义(ai-concept-crafter 等)
|
|
267
|
+
├── knowledge-mcp.py # 安装/卸载脚本(纯 Python 跨平台)
|
|
268
|
+
├── knowledge-mcp-setup.sh # Shell 入口(legacy)
|
|
269
|
+
├── knowledge-mcp-setup.ps1 # PowerShell 入口(legacy)
|
|
270
|
+
└── pyproject.toml # 依赖:fastmcp + fastembed + httpx + pyyaml
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## 依赖
|
|
274
|
+
|
|
275
|
+
- Python >= 3.11
|
|
276
|
+
- fastmcp >= 0.1.0
|
|
277
|
+
- fastembed >= (hard dependency,内置模型无需下载)
|
|
278
|
+
- httpx >= 0.27.0
|
|
279
|
+
- pyyaml >= 6.0
|
|
File without changes
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""CLI 入口:app-knowledge-mcp init / enable / disable"""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from .installer import (
|
|
8
|
+
init_project,
|
|
9
|
+
enable_global,
|
|
10
|
+
disable_global,
|
|
11
|
+
log,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def main() -> int:
|
|
16
|
+
parser = argparse.ArgumentParser(description="app-knowledge-mcp — 聚合 MCP 本地网关")
|
|
17
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
18
|
+
|
|
19
|
+
init_p = sub.add_parser("init", help="为项目安装 MCP 能力")
|
|
20
|
+
init_p.add_argument("project_dir", nargs="?", default=".",
|
|
21
|
+
help="业务仓库目录(默认当前目录)")
|
|
22
|
+
init_p.add_argument("--project", default=None,
|
|
23
|
+
help="平台 project 标识(如 callwatch)")
|
|
24
|
+
|
|
25
|
+
sub.add_parser("enable", help="注册到全局 opencode config")
|
|
26
|
+
sub.add_parser("disable", help="从全局 opencode config 移除")
|
|
27
|
+
|
|
28
|
+
args = parser.parse_args()
|
|
29
|
+
|
|
30
|
+
if args.command == "init":
|
|
31
|
+
project_dir = Path(args.project_dir).resolve()
|
|
32
|
+
if not project_dir.is_dir():
|
|
33
|
+
log(f"目录不存在: {project_dir}", "ERROR")
|
|
34
|
+
return 1
|
|
35
|
+
init_project(project_dir, args.project)
|
|
36
|
+
return 0
|
|
37
|
+
|
|
38
|
+
if args.command == "enable":
|
|
39
|
+
enable_global()
|
|
40
|
+
return 0
|
|
41
|
+
|
|
42
|
+
if args.command == "disable":
|
|
43
|
+
disable_global()
|
|
44
|
+
return 0
|
|
45
|
+
|
|
46
|
+
return 0
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == "__main__":
|
|
50
|
+
sys.exit(main())
|