Engineering

一个问题,四种语言:用 Fantom MCP Server 实现跨技术栈的代码智能

Vue 组件里的一个下拉框、一个 Fantom weblet、一条通过 UDP 发出的 SOX 命令,以及一台 Sedona 控制器。它们是一个功能、四种语言——而在此之前,是四次各自独立的搜索。

Alper Üzmezler· Sep 16, 2026 · 12 分钟阅读

下面是一位控制工程师真实会问的问题:

“当我在 Web 编辑器中把一个组件拖到画布上并点击保存时,最终在链路上发往控制器的到底是什么?”

这是一个完全合理的问题。但在大多数代码库中,它也意味着一场两小时的“考古”——因为要回答它,你得跨越四种语言、三个运行时和一个网络协议,而没有任何一个搜索工具能同时看到它们。

Fantom MCP Server 就是为这个问题而生的。

这个问题跨越的技术栈

Sandstar Web Editor 是面向 Sedona Framework 的可视化编程环境。你把组件拖到画布上,把它们连起来,然后部署到在线控制器。在底层,一次用户操作会穿过一个真正异构的技术栈:

Sandstar Web Editor 画布 Rete.js 节点图 · PrimeVue 组件 .vue .ts Fantom pod(sweExt) 提供应用服务 · SkySpark 视图 + weblet .fan Sandstar Web Socket · 端口 7070 输入 JSON · 输出 17 种 SOX 命令类型 router 基于 DASP / UDP 的 SOX 读取 · 写入 · 订阅 · 文件传输 Sedona 控制器 在线硬件 一个问题

四种语言,一个功能。grep 能在它们全部之中找到字符串 sox。但它无法告诉你:Fantom weblet 中的 writeComp 处理函数正是 Vue store 调用的那个东西,也无法告诉你改动它的签名会破坏三层之外的一条订阅路径。

一个索引,二十三种语言

Fantom MCP Server 的语言注册表覆盖 23 种语言

axon · c · cpp · csharp · css · dart · fantom · go · html · java · javascript · json · kotlin · php · polymer · python · ruby · rust · scala · swift · typescript · vue · xeto

axon fantom xeto vue typescript javascript html css java kotlin scala csharp python ruby php go rust swift dart c cpp polymer json vue typescript fantom xeto 一个索引。Web 编辑器的这个问题同时触及其中四种。 Fantom、Axon 和 Xeto 拥有专门编写的 tree-sitter 语法。

其中三套语法——FantomAxonXeto——是为这个项目专门编写的,因为此前根本不存在。这很重要,原因与在 Axon MCP Server 中一样:一个在代码块中间被截断的分块,就是一个毫无意义的分块。

三个索引,而不是一个

仅靠语义搜索不足以回答结构性问题。Fantom MCP Server 维护三个存储,并把它们协同使用:

  • LanceDB 保存向量,背后是 ANN 索引。早期版本在每次查询时都做全表扫描;构建近似索引正是让检索从“能察觉到延迟”变成“即时”的关键。
  • LadybugDB(Kuzu)保存真正的调用图——节点与边,持久化存储。getCallersgetCalleesgetCodeImpactgetCodeNeighbors 都是图查询,而不是每次请求都重跑一遍的 grep。
  • FlexSearch 保存关键词索引,因为有时候你确实知道那个标识符。

向量侧和关键词侧的结果通过倒数排名融合(RRF)合并,然后可选地由 cross-encoder 或 OpenRouter 重排器重新排序。其中哪一个运行、在哪里运行,是一个路由决策——在单独的一篇文章中讲述

实际用起来是什么样

askCodebase 在索引上运行一个检索循环,并合成一个带引用的答案——引用正是关键所在。对于跨语言的问题,有用的答案形态不是“这里有一段文字”,而更像是“这里是四个函数,分属四种语言,按调用顺序排列”。

示意性说明——以下是跨栈答案的形态,而非某次具体运行的记录:

  • .ts 中的一个 Vue store action,它发出一条 JSON 消息
  • .fan 中接收它的 weblet 处理函数
  • 将该消息映射到 17 种 SOX 命令类型之一的路由条目
  • 最终通过 DASP/UDP 发往链路的组件写入路径

然后你可以对其中任意一个调用 getCodeImpact,弄清楚改动它还会牵动什么。这正是在没有持久化图的情况下真正难以完成的查询,也正是能帮你省下一个下午的那一个。

追问代码为什么变成这样

结构回答的是“谁调用了谁”。另一类工具回答的是“它为什么是这样”:

  • whatChangedRecently —— 这个项目最近有什么变动
  • getSymbolHistory —— 某个函数是如何演变的
  • explainSymbolChange —— 某次具体改动做了什么
  • diffIndexRuns —— 索引本身在两次运行之间看到了哪些不同

对于一个跨越数年维护、并在集成商之间辗转交接的代码库来说,这往往比语义搜索更有价值。代码是可读的。真正随着上一位工程师一起离开的,是那些推理与决策

而且它依然能做迁移

SkySpark 4.0 改变了扩展格式。migrateSkySpark4x 会重写 using 语句、转换 Axon 字符串、生成 Xeto 文件(lib.triofuncs.xetolib.xeto)、用 Fantom 编译器进行校验,并在开始时打上 Git 备份标签。commitMigration 完成迁移;rollbackMigration 一次调用即可撤销。

总计 41 个 MCP 工具,覆盖文档搜索、语义代码搜索、调用图分析、历史、生成与迁移。

老实说的总结

Fantom MCP Server 并不会让你的代码库变得更简单。Web 编辑器仍然是 Vue 与 Fantom 对话、Fantom 再通过 UDP 上的 SOX 与控制器对话——对于它要做的事情来说,这就是正确的架构。

真正改变的是:这些层之间的边界,不再是搜索工具面前的高墙。一个问题,问一次,跨越全部四层——然后按顺序把那些函数返回给你,不论它们碰巧是用哪种语言写的。


Fantom MCP Server 以源代码可见(source-available)方式发布于 github.com/Project-SandStar/FantomMcpServer。另见项目页面Sandstar Web Editor