cangjie-knowledge-mcp
MCP server for Cangjie knowledge retrieval, enabling Java-to-Cangjie translation with API search, class members, examples, Java mappings, and error hints.
README
cangjie-knowledge-mcp
Cangjie 知识库 + MCP 服务器,为 Java → Cangjie 片段翻译提供 API 检索能力。
在翻译一个 Java 片段之前,先通过 MCP 工具做相似度检索,找到片段中用到的类/方法/类型在
Cangjie 标准库中的来源(哪个库、哪个模块)、完整签名、官方示例代码;翻译失败进入
错误修复循环时,也可以调用本工具(error_fix_hint)根据编译错误定位相关 API 和示例。
它能回答什么问题
| 场景 | 用法 |
|---|---|
HashMap.put(key, value) 在 Cangjie 里怎么调? |
search_api("map put key value") → 找到 HashMap 的 add(K,V)/replace(K,V)(Cangjie 没有 put) |
ArrayList 有哪些方法? |
get_class_members("ArrayList") → 27 个成员及签名 |
| 读文件怎么写? | find_examples("read file bytes") → 官方 sample 代码 |
java.util.List 对应 Cangjie 什么? |
java_to_cangjie("java.util.List") → j2cjlib 映射 |
cannot find symbol println 怎么修? |
error_fix_hint("...") → 相关 API 文档 + 示例 |
架构
cangjie-knowledge-mcp/
├── config.yaml # 语料路径、索引参数、LLM 配置
├── src/cjkb/
│ ├── models.py # ApiRecord / ExampleRecord / JavaMapping 数据模型
│ ├── config.py # 配置加载(支持环境变量覆盖)
│ ├── collector/
│ │ ├── corpus_parser.py # 解析 CangjieCorpus 官方文档 → API/示例记录
│ │ ├── j2cj_parser.py # 解析 j2cjlib shim + 术语表 → Java→Cangjie 映射
│ │ └── example_writer.py # (可选)LLM 为缺少示例的 API 生成示例
│ ├── index/
│ │ ├── bm25.py # 纯标准库 BM25(字段加权, 驼峰/下划线分词)
│ │ └── searcher.py # 检索 API(相似度 + 精确名 + Java 术语扩展)
│ └── mcp_server.py # MCP stdio 服务器(零第三方依赖)
├── scripts/
│ ├── build_kb.py # 收集 + 建索引 → data/
│ └── query_demo.py # 命令行检索演示
├── tests/ # 单元测试 + MCP 端到端测试
└── data/ # 构建产物(知识库, gitignore)
数据流
CangjieCorpus(官方文档)
│ libs/std/* API 参考(3543 条 API)
│ *_package_samples/* 官方示例
│ manual/ 语言手册
v
collector/corpus_parser.py ──┐
├──> KnowledgeBase(JSONL) ──> BM25 索引 ──> MCP server
j2cjlib shim + 术语表 ────────┘ │ (stdio, 7 个工具)
数据来源(知识库的内容来自哪里)
| 来源 | 内容 | 位置 |
|---|---|---|
| CangjieCorpus | 官方 stdlib 文档:std.* 37 个模块 + stdx.* 扩展库,含 API 签名、功能说明、官方示例 |
misc/CangjieCorpus(即 gitcode.com/Cangjie/cangjie_runtime 文档的本地镜像) |
| j2cjlib | 手写的 Java 兼容 shim 类(J2CjThread、J2CjByteArrayInputStream、TimeUnit…),直接给出 Java 类 → Cangjie 类的对应 |
misc/j2cjlib |
| java_cangjie_terms.yaml | Java 术语 → Cangjie 术语词汇表,用于查询扩展(搜 "Thread" 也能命中含"线程"的文档) | x2cangjie configs/ |
检索原理
- 分词:驼峰拆分(
getOrThrow→get or throw)、下划线拆分(read_file_bytes→read file bytes)、中英文混合。 - BM25 字段加权:
name × 4>signature × 3>module × 2>tags × 1.5>description × 1,让"按名检索"比"按描述检索"更准。 - Java 术语扩展:查询 token 先查 Java→Cangjie 映射表,把 Java 词汇展开成 Cangjie 同义词再检索(解决
Threadvs线程的匹配问题)。 - 精确名索引:
get_api_details/get_class_members走精确名 → 记录索引,不依赖相似度。
MCP 工具(7 个)
| 工具 | 说明 | 典型调用 |
|---|---|---|
search_api |
API 相似度检索,返回签名/模块/来源/描述 | search_api("HashMap put key value") |
get_api_details |
按名精确查函数/类/接口 | get_api_details("add", module="std.collection") |
get_class_members |
类的全部成员(init/prop/func) | get_class_members("ArrayList") |
find_examples |
检索示例代码 | find_examples("read file lines") |
java_to_cangjie |
Java 符号 → Cangjie 等价物 | java_to_cangjie("java.util.List") |
error_fix_hint |
编译错误 → 相关 API + 示例 | error_fix_hint("cannot find symbol println") |
list_modules |
列出知识库中所有模块 | list_modules() |
快速开始
# 1. 安装依赖(仅 PyYAML;索引核心零依赖)
pip install -r requirements.txt
# 2. 构建知识库(默认读 config.yaml 中的语料路径)
python scripts/build_kb.py
# 3. 命令行试一下
python scripts/query_demo.py "HashMap put key value"
python scripts/query_demo.py --class-members ArrayList
python scripts/query_demo.py --java "java.util.List"
# 4. 启动 MCP 服务器(stdio)
python -m cjkb.mcp_server --data-dir data
如果语料不在默认路径,用参数覆盖:
python scripts/build_kb.py \
--corpus D:/x2cangjie/x2cangjie/misc/CangjieCorpus \
--j2cjlib D:/x2cangjie/x2cangjie/misc/j2cjlib \
--terms D:/x2cangjie/x2cangjie/configs/java_cangjie_terms.yaml
在 agent 工具中注册 MCP
在 opencode 的 opencode.json(或 Claude Desktop 配置)中注册:
// opencode.json
{
"mcp": {
"cangjie-kb": {
"type": "stdio",
"command": "python",
"args": ["D:/x2cangjie/cangjie-knowledge-mcp/src/cjkb/mcp_server.py", "--data-dir", "D:/x2cangjie/cangjie-knowledge-mcp/data"],
"env": {}
}
}
}
注册后,agent 在片段翻译和错误修复时可以直接调用上述 7 个工具。
在片段翻译流程中使用
以 x2cangjie 的 translate_fragment.sh 流程为例,推荐的调用时机:
-
翻译前(对应 prompt 注入顺序中的 RAG 层,见
docs/fragment_translation_enhancements.md):- 从待翻译片段中提取方法调用/类型引用(如
HashMap.put、FileInputStream) java_to_cangjie("java.util.HashMap")→ 得到 Cangjie 类型get_class_members("HashMap")→ 确认实际方法名(add而非put)find_examples("HashMap")→ 取官方示例注入 prompt
- 从待翻译片段中提取方法调用/类型引用(如
-
错误修复循环(
compositional_translation_validation.py中cjpm build失败后):- 把编译错误文本传给
error_fix_hint→ 返回相关 API 签名和示例 - 把结果拼进错误反馈 prompt,再让 LLM 修复
- 把编译错误文本传给
-
类型解析(
translate_type_rag.py的 RAG 兜底层):把search_api结果作为额外证据注入类型映射 prompt。
说明:本项目是独立于 x2cangjie 的新项目,不修改 x2cangjie 的代码。接入方式有 两种:(a) 在 agent(MCP 客户端)侧注册上面的 server,让 agent 直接调用; (b) 在 x2cangjie 的 Python 代码中 import
cjkb直接调用Searcher(程序化 API)。
程序化调用(不经过 MCP)
import sys
sys.path.insert(0, "src")
from cjkb.config import load_config
from cjkb.index.searcher import Searcher
cfg = load_config("config.yaml")
s = Searcher.load(cfg["output"]["data_dir"], cfg)
for r in s.search_api("HashMap put key value"):
print(r.name, r.module, r.signature)
for m in s.java_to_cangjie("java.util.List"):
print(m.java_symbol, "->", m.cangjie_symbol)
可选:LLM 生成缺失示例
对知识库中没有官方示例的 API,可以用 LLM 自动补写示例(每条都标记 generated=true,
与官方示例区分):
export OPENAI_API_KEY="..."
export OPENAI_BASE_URL="https://openrouter.ai/api/v1" # 可选
python scripts/build_kb.py --write-examples --example-limit 50
生成的示例会写入 data/examples.jsonl,generated 字段为 true。
测试
python -m unittest discover -s tests -v # 单元测试
python tests/mcp_e2e.py # MCP stdio 端到端测试
知识库现状(基于本机语料构建)
apis: 3543 (std.* + stdx.* + manual 中可解析的函数/类/接口/枚举)
examples: 224 (官方 _package_samples + extra 指南代码块)
java_mappings: 93 (j2cjlib shim 类 + 术语表)
modules: 48 (std: 37, stdx: 11)
扩展方向
- 向量检索:当前 BM25 对同义改写不敏感,可加 embedding 层(如
sentence-transformers) 做混合检索。 - gitcode 官方 API 文档:gitcode 需要登录才能拉取
cangjie_runtime/stdlib/doc, CangjieCorpus 已含等价内容;若以后能免密拉取,可把stdlib/doc的 .md 直接喂给corpus_parser。 - 翻译记忆库:把 x2cangjie 历史成功翻译的"Java 片段 → Cangjie 片段"对收进示例库, 作为 few-shot 参考(类似 Progressive KB,但走 MCP)。
- 错误模式库:把
analyze_errors.py的历史错误分类结果沉淀为"错误 → 修复模式"条目。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。