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.
Files changed (41) hide show
  1. xtc_app_knowledge_mcp-0.1.0/PKG-INFO +9 -0
  2. xtc_app_knowledge_mcp-0.1.0/README.md +279 -0
  3. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/__init__.py +0 -0
  4. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/__main__.py +4 -0
  5. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/cli.py +50 -0
  6. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/cloud_client.py +387 -0
  7. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/frontmatter.py +50 -0
  8. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/installer.py +529 -0
  9. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/local_embedding.py +177 -0
  10. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/local_search.py +228 -0
  11. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/server.py +957 -0
  12. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-doc-format-rewrite/SKILL.md +197 -0
  13. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-doc-format-rewrite/eval.yaml +670 -0
  14. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-doc-format-rewrite/prompt.md +550 -0
  15. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/SKILL.md +349 -0
  16. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/architecture-lens-design.md +249 -0
  17. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/card-generator-design.md +178 -0
  18. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/card-splitter-design.md +158 -0
  19. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/knowledge-lifecycle-design.md +342 -0
  20. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/design/knowledge-wiki-design.md +367 -0
  21. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/architecture-lens.md +289 -0
  22. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/artifact-validator.md +89 -0
  23. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/card-generator.md +114 -0
  24. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/card-splitter.md +217 -0
  25. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/impact-analyzer.md +164 -0
  26. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/prompts/wiki-analyzer.md +134 -0
  27. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/scripts/generate-wiki.py +293 -0
  28. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/scripts/validate-mermaid.py +65 -0
  29. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/architecture-overview.template.md +80 -0
  30. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/impact-report.template.md +75 -0
  31. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/knowledge-graph-structure.md +187 -0
  32. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/module-source-manifest.template.md +78 -0
  33. xtc_app_knowledge_mcp-0.1.0/app_knowledge_mcp/templates/dev-toolkit/skills/knowledge-lifecycle/template/summary.template.md +21 -0
  34. xtc_app_knowledge_mcp-0.1.0/pyproject.toml +24 -0
  35. xtc_app_knowledge_mcp-0.1.0/setup.cfg +4 -0
  36. xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/PKG-INFO +9 -0
  37. xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/SOURCES.txt +39 -0
  38. xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/dependency_links.txt +1 -0
  39. xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/entry_points.txt +2 -0
  40. xtc_app_knowledge_mcp-0.1.0/xtc_app_knowledge_mcp.egg-info/requires.txt +4 -0
  41. 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
@@ -0,0 +1,4 @@
1
+ from .cli import main
2
+
3
+ if __name__ == "__main__":
4
+ raise SystemExit(main())
@@ -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())