答案一直存在,只是散在各处。
数据规模的增长,总是快过描述它的文档。
-
Schema 散落在许多地方
每个实例都有自己的控制台、自己的命名习惯、自己的历史。没有人能跨库搜索。
-
血缘靠问,而不是靠查
「这个字段是从哪来的?」往往要问写管道的人——而这份知识会随他一起离开。
-
口径会漂移
两个团队用不同算法算出同一个指标,因为没有任何地方记录过这个列上个季度到底是什么意思。
它能做什么
六项能力,一次部署,一个数据库。
-
元数据注册中心
把各实例的 schema 同步进一个统一且可搜索的注册中心,每个表和每个列都保存着自己的 DDL 与变更历史。
-
表级与列级血缘
血缘从视图、物化视图和手动 SQL 中分析得来,精确到列。血缘图可以按深度展开,也可以沿着单个列的轨迹往下追踪。
-
OpenLineage
摄入 run 事件,映射 namespace,签发 API key;浏览 job、dataset 和 event,并提供跳回 Airflow 的链接。
-
SQL 解释
借助 LLM 解释一条 SQL 语句,解释范围限定在你所选的元数据之内,并带缓存。
-
访问控制与审计
用户、用户组、命名角色和访问策略编辑器;需要审计的操作会写入一份永久保留的审计日志。
-
Agent 集成
mxd 命令行客户端让 Agent 每条命令只拿到一个 JSON 文档、退出码稳定,并支持设备码登录。启用 MCP 后,注册中心还会以只读工具的形式提供。
血缘
精确到列
表级图只能告诉你两个系统有关系,它不会告诉你哪个列流到了哪里,也不会告诉你是两个写入方中的哪一个写进去的。
-
两种来源,一张图
从视图定义、物化视图和手动 SQL 分析出的边画实线;从 OpenLineage 事件摄入的边画虚线;同时被两者写入的对象用第三种线型,这样节点的归属和边的来源永远不会读成同一件事。
-
实例有自己的颜色
不同实例里的对象可能同名(库、schema、表都一样)。每个实例取一组调色板里的一个强调色,全部通过 WCAG 图形对比度下限;颜色只是备份——同样的信息由线型承载,灰度下依然可辨。
-
沿着单个列追踪
选中一个字段,可以看到它的上下游轨迹、途经的关系,以及触碰过它的 OpenLineage run。临时关系只存在于语句内部,默认隐藏;当隐藏会导致空结果时,会显式报出数量。
OpenLineage
你的调度器本来就知道,让它说出来
摄入 run 事件,映射 namespace,签发 API key;浏览 job、dataset 和 event,并提供跳回 Airflow 的链接。
- 1
1. 把生产者指向接入端点
设置 → OpenLineage 会显示摄入端点、一段可直接用的 curl 示例,以及用于认证的 API key 列表。
- 2
2. 映射 namespace
生产者上报的 namespace 会与你的某个实例匹配——按主机和端口自动匹配,或按你显式记录的映射。
- 3
3. 读这次运行
Job、Dataset 与 Event 视图保留了原始 JSON 与 facets,任何一个结论都能追溯回产生它的事件。
为什么 facet 不被信任
生产者的 column facet 不被信任。Airflow 的 SQL operator 会给每个 task 附上一个 column facet——那是运行级猜测,不是语句的答案:它把每条语句合并成一个输入集合,再靠在其中任意位置找一个同名列来归属输出列。这样得到的答案看起来像结论,却可能是错的。因此,当事件自带 SQL 时,平台会把这段 SQL 交给与视图定义、手动 SQL 相同的、以语句为范围的分析器;只声明列血缘而不带 SQL 的生产者,仍然沿用它自己的 facet;无法分析的运行保留表级边并报告缺口。
元数据注册中心
每张表,带 DDL 与历史
把各实例的 schema 同步进一个统一且可搜索的注册中心,每个表和每个列都保存着自己的 DDL 与变更历史。
-
按你的思路浏览
实例 → 数据库 → schema → 表 → 列。表清单直接带出行数、数据大小、列数与索引,第一眼就能回答「长什么样」的问题。
-
按名称或备注搜索
知道表叫什么能搜到;只知道它是干什么的,也能搜到。
-
不会有东西悄悄消失
schema 同步对删除是「只记日志」的设计:它记录将要移除什么,而不是直接删掉注册表里的条目,对象的历史也会保留。
SQL 解释
限定在你选定元数据范围内的解释
借助 LLM 解释一条 SQL 语句,解释范围限定在你所选的元数据之内,并带缓存。
-
限定范围,而不是放开
模型看到的是这条语句,加上你选中的元数据——不是你整个数仓。哪些表和列可以参与推理,由你决定。
-
用你读界面的语言作答
解释会用界面当前的语言返回。
-
带缓存
同一条语句、同一份选择,走缓存返回,不为同一件事付两次费。
SELECT region, sum(net_amount) AS revenueFROM dwd_order_fact fJOIN dim_region r ON r.id = f.region_idWHERE f.loaded_at >= date '2026-01-01'GROUP BY region;模型看到的输入,只有这条语句和你选中的元数据。
访问控制与审计
谁可以做什么,谁做过什么
用户、用户组、命名角色和访问策略编辑器;需要审计的操作会写入一份永久保留的审计日志。
角色由你定义
一份权限目录、预定义与自定义角色,以及一份工作区访问策略。
是账本,不是日志文件
审计日志永久保留,不会被清理。
读操作同样留痕
每一次 MCP 工具调用都会被审计——包括只读调用,因为那是一个由模型驱动的远程入口。
授权是工作区级的:每个成员都能读全部内容,写操作需要工作区管理员——这是为单租户、自托管部署设计的。
Agent 集成
为「程序来调用」而设计
mxd 命令行客户端让 Agent 每条命令只拿到一个 JSON 文档、退出码稳定,并支持设备码登录。启用 MCP 后,注册中心还会以只读工具的形式提供,由 OAuth 2.1 授权服务器保护。
mxd —— 每条命令一个 JSON 文档
每条命令只会往 stdout 写一个 JSON 文档,进度、警告和错误都走 stderr。失败会带上稳定的 code 与退出码,调用方无需解析自然语言就能决定下一步。mxd skill install 会把对应指令放到 Agent 运行时能找到的位置。
$ mxd lineage sql --file etl.sql --depth 2{ "results": [ { "scopeName": "dev", "scopeGuid": "1;shop", "relations": [ {"sourceGuid": "1;shop;;orders", "sourceColumn": "amount", "targetGuid": "1;shop;;order_daily", "targetColumn": "amount", "isTemp": false} ], "warnings": [] } ], "warnings": []}MCP —— 注册中心变成只读工具
在设置 → 通用设置里启用端点(需要先配置工作区外部地址)。MCP 客户端会被告知去哪里授权、自行注册并走 PKCE 流程,决定会记录在同意页面上。这里没有任何写操作。
{ "mcpServers": { "metaxisdata": { "type": "http", "url": "https://mx.example.com/mcp" } }}架构
一个二进制,一个依赖
一次部署就是一个 Go 二进制,加一个 PostgreSQL。
一个端口,两半
Go 二进制在同一端口(8083)上提供 ConnectRPC API 和前端——一个内嵌进镜像的 Vue 3 单页应用。启用 MCP 时,MCP 端点也在同一端口上。
PostgreSQL 是唯一的外部依赖
schema 在启动时自动迁移,因此一个全新的数据库只需要一个连接串。
后台 runner 干活
它们负责同步 schema、分析并校验血缘,以及执行维护任务。schema 同步与血缘分析随服务端启动就开始,不等慢速定时器。
- 端口
- 8083
- 外部依赖
- 1
- 版本
- v0.1.0
快速上手
五分钟,看到第一次同步完的 schema
需要准备 Docker,以及一个容器可达的 PostgreSQL 数据库。镜像发布在 GHCR,覆盖 linux/amd64 与 linux/arm64。
- 1
创建第一个账号
它会成为工作区管理员。
- 2
添加一个实例
指向服务端可达的 MySQL/TiDB 或 PostgreSQL 实例。
- 3
同步它的 schema
表、列、DDL 与历史进入注册中心;血缘会从同步到的东西里分析出来。
最常被先问到的几个问题
现在可以上生产吗?
目前是 v0.1.0 alpha。核心功能已经实现并有测试覆盖,发布二进制与镜像也已发出——但请把它当作 alpha 软件,并在依赖它之前先读一遍部署指南。
谁能看到什么?
授权是工作区级的:每个成员都能读全部内容,写操作需要工作区管理员。这适合单租户、自托管的部署场景;它不是多租户隔离模型。
运行它需要什么?
一个 Go 二进制,和一个它能连上的 PostgreSQL。不需要消息队列、对象存储或搜索集群。
我的数据会去哪?
哪也不去。元数据与血缘都留在你自己的 PostgreSQL 里。产品唯一可能发起的对外调用,是你为 SQL 解释配置的 LLM 提供商——而它看到的只有那条语句和你选中的元数据。
许可协议是什么?
Apache-2.0。可以自托管、修改,也可以商用。