跳到正文
cajulang

面向 AI 助手的 Caju

caju mcp 是内置于 caju 命令中的 Model Context Protocol 服务器。Claude Code、Claude Desktop、Cursor 等助手通过返回结构化结果的工具来使用编译器:阅读语言参考、查询标准库,以及检查、运行和测试代码。

$ claude mcp add caju -- caju mcp

CLI 还是 MCP:实测对比

同样的三个任务,由 Claude Code 分别完成:一种只能在 shell 中使用 caju 命令,另一种只能使用 MCP 工具。模型相同、提示词相同,都从只含任务文件的空目录开始;每个结果事后都经过检验。

cli5/6正确
mcp6/6正确
轮数3.3×
cli30.3
mcp9.2
编译器调用次数10.5×
cli17.8
mcp1.7
输入 token(千)4.2×
cli540
mcp129
耗时(秒)4×
cli48.6
mcp12.2
成本(美元)2.1×
cli0.168
mcp0.079
任务正确轮数编译器调用次数耗时(秒)
编写程序找出一段文本中出现最多的 5 个单词,按出现次数排序,次数相同时按字母顺序排序。
cli2/2161023.7
mcp2/25.51.59.7
从 Go 到 Caju把一段 Go 风格的程序改成合法的 Caju,并输出指定的两行。
cli1/2533188.1
mcp2/2101.512
编写测试为一个藏有 bug 的栈模块编写至少 4 个测试。
cli2/22212.534
mcp2/212214.8

先读,再写

使用 MCP 时,每次运行都先调用 caju_reference 和 caju_docs,然后一次写好程序。大多数程序第一次就是正确的。

没有它,编译器就是手册

使用 CLI 时,助手靠错误信息学习 Caju:先运行 caju --help,再写一个个小的试探程序,一次只试一种语法结构,每次出错就重写。有一次运行直到用完 40 轮上限,仍在摸索语法。

错误直指修复点

带有行、列和阶段的诊断信息能让助手直接定位到需要修改的那一行,而不必阅读文本再去猜测。

它会自己找到服务器

在第一轮测试中,caju mcp 没有被屏蔽,CLI 方式的运行在 caju --help 中发现了它,并从 shell 用 JSON-RPC 与它通信来读取语言参考。

每个任务、每种方式各运行两次,只用了一个模型,任务也很小:方向很明确,具体比例则不然。CLI 方式的运行不能使用其他 shell 命令。程序、日志摘要和测试方法见语言仓库的 bench/mcp。 bench/mcp/RESULTS.md

一次真实会话

一个助手(Claude Sonnet 5.5)借助 MCP 工具,把一段 Go 风格的程序改写为 Caju。这是下文对比中的一次运行,有所删节,保留英文原文。

任务

main.caju was written in Go style, but it must be a valid program in the Caju programming language. Rewrite it so that it prints exactly "CASHEW, MANGO" and "total: 16.00".

第 1 步,共 9 步

五个工具

检查、运行和测试以 JSON 回答,助手无需解析编译器的文本输出。代码图工具每个符号只返回一行简短内容,而不是整个文件:图保存在服务器内存中,查询约 2 毫秒。

只做类型检查,不生成代码。每个错误都附带文件、行、列以及所属阶段(语法、类型、链接……)。

请求 · caju_check
{ "files": {
    "main.caju": "x := 1\nx = \"a\"\n"
} }
响应 · caju_check
{ "ok": false, "diagnostics": [ {
    "file": "main.caju", "line": 2, "col": 5, "stage": "type",
    "message": "\"x\" (line 1) is int, but got str"
} ] }

配置

它随 caju 命令一起提供,无需另外安装。

Claude Code
claude mcp add caju -- caju mcp
Claude Desktop、Cursor、VS Code 及其他客户端
{
  "mcpServers": {
    "caju": { "command": "caju", "args": ["mcp"] }
  }
}

如果客户端读不到你的 PATH,请使用 caju 的完整路径(通过安装脚本安装时为 ~/.local/bin/caju)。服务器从标准输入读取 JSON-RPC 消息,每行一条。

为什么新语言需要它

助手在训练时从未见过 Caju,而 Caju 又和 Go 足够相似,很容易被写成 Go。服务器为它提供真实的语言参考、标准库中真实的名称,以及每个错误的精确位置,让它不再靠猜。