alitrack

你的 AI 现在能写数据管道了。MotherDuck 把它做成了产品

数据管道一直是个"基本被解决但没人觉得好用"的事。从手写 ETL 脚本到 Fivetran/Airbyte 的点选式 UI,再到 dlt 这样的声明式 Python 库——每代工具都更省力一点,但有一个角色始终缺席:写代码的人。

6 月 10 日,MotherDuck 上线了 Flights,一个 agent-native 的数据管道功能。说人话:把你的 AI agent 连到 MotherDuck 的 MCP server,告诉它"帮我从 GitHub API 拉仓库数据,每小时同步一次",agent 写 Python 代码、部署、设 cron——你不需要动键盘。

Flights 目前是 public preview,在 MotherDuck 文档里有完整的 Flight Plan 模板可以上手。

● ● ●

三种方式来管 Flights

虽然 agent-native 是 Flights 的主打卖点,它其实提供了三种操作入口:

1. MCP Server(Agent 入口)

把 Claude、Cursor、ChatGPT 或任何 MCP 兼容的 agent 连到 MotherDuck 的 MCP server,agent 会得到完整的 Flights 工具集:create_flight、run_flight、schedule_flight、get_logs、edit_flight_source、delete_flight。还有一个内置的 get_flight_guide 工具,告诉 agent 怎么写符合 MotherDuck 规范的 Flight 代码。

你只需要用自然语言描述数据源和目标表,agent 会先探查你已有的 schema,写一个 Python pipeline,部署并设好调度。Secrets 存在 MotherDuck 里,运行时注入,agent 全程看不到。

2. SQL 表函数

每一个 Flight 操作都有对应的 SQL 表函数。创建就是一个 SELECT:

SELECT * FROM md_create_flight(
    name              := 'daily_signups',
    access_token_name := 'prod_token',
    schedule_cron     := '0 9 * * *',
    source_code       := $$
import duckdb

def main():
    duckdb.connect("md:").execute("""
        INSERT INTO analytics.signups
        SELECT * FROM 'https://api.example.com/signups.json'
    """)
$$
);

MD_RUN_FLIGHT、MD_GET_FLIGHT_LOGS、MD_LIST_FLIGHTS 等等——所有操作都是 SQL 一行。你的 BI 工具、dbt、甚至另一个 Flight 都能管 Flights。

3. Web UI

在 MotherDuck 控制台里直接写 Python、设 cron、点一下运行。日志、run history、版本、环境变量、requirements.txt 都有可视化界面。

三个入口底层是同一个原语:一个专用的 Python 运行时,能 pip install 任何包,通过 DuckDB Python client 连到你的 MotherDuck 数据库。

● ● ●

一个真实例子:dlt + Flights

dlt(data load tool)是 Flights 推荐的 ingest 库。它是一个声明式的 Python 数据加载框架,自动处理 schema 演进、增量加载、合并策略,并且有 MotherDuck 的一等公民 destination。

下面是一个完整的 Flight——从 GitHub API 拉仓库元数据,merge 到 MotherDuck 表:

import os
import dlt
import httpx

def repo_rows(repos):
    for repo in repos:
        response = httpx.get(f"https://api.github.com/repos/{repo}")
        payload = response.json()
        yield {"repo": repo, "stars": payload["stargazers_count"]}

def main():
    os.environ.setdefault("HOME", "/tmp")
    pipeline = dlt.pipeline(
        pipeline_name="github_stats",
        destination="motherduck",
        dataset_name="analytics",
    )
    pipeline.run(
        repo_rows(["duckdb/duckdb", "motherduckdb/motherduck-docs"]),
        table_name="repos",
        write_disposition="merge",
        primary_key="repo",
    )

把这个文件保存为 flight.py,attach 一个 cron 调度,dlt 接管后续所有事:建表、schema 演进、按 repo 主键做增量 merge、用 Parquet 做 bulk loading。把 repo_rows 换成 dlt 支持的任何 source——REST API、Postgres、BigQuery、S3、dlt 的 verified-source 目录——你就有了一个生产级的 ingestion pipeline。

完整版(带配置驱动参数、run ledger、schema 校验)在 MotherDuck 的 flight-dlt-ingest Flight Plan 里有模板。

● ● ●

Flights + Dives = 一条龙

MotherDuck 的另一个产品 Dives 是做可视化仪表盘和数据 App 的——React 组件驱动,直接跑在 MotherDuck 数据上。Flights 管摄入和转换,Dives 管探索和可视化。

关键是 同一个 MCP server 同时暴露 Flights 和 Dives 的工具。一个 agent 在一个 chat 里就能完成:拉数据 → 建表 → 写 pipeline → 设调度 → 做仪表盘。

这在传统数据栈里需要至少三个工具(ETL + 数仓 + BI)+ 至少一个人来协调。现在一个 agent 对话就行。

● ● ●

"agent-native" 到底是什么意思

MotherDuck 对 "agent-native" 的定义比较实在,不是什么 buzzword。

传统数据栈的设计对象是人——SQL 编辑器、拖拽 UI、YAML 配置。Agent 需要的东西不一样:工具化的 API surface(不是 UI),清晰的指令文档(get_flight_guide 这种),统一的控制面(compute + secrets + scheduling + observability 在一个 MCP server 里)。

MotherDuck 的论点:把一个 agent 扔到碎片化的数据栈上(一个工具管 ETL、一个管数仓、一个管 BI,各自有各自的 API 和权限),agent 会频繁在工具边界上失败。把 compute、数据、调度、secrets、监控全部收进一个 MCP server,agent 的成功率会高得多。

Flights 是这个论点的第一个产品化尝试。

● ● ●

边界在哪

Flights 不是 Airflow 或 Prefect 的替代品。一个 Flight 就是一个 Python 进程,没有内置的任务队列、分布式状态、DAG 编排。可以一个 Flight 调 MD_RUN_FLIGHT 去触发另一个来做 fan-out,或者在 Python 里用线程池做并行——但编排逻辑要自己写。

Flights 最适合的场景是 MotherDuck 中心化的工作负载:数据、调度和计算全在 MotherDuck 里,不需要跨多个外部系统编排。如果 pipeline 大量依赖外部服务,Airflow/Prefect 仍然是更好的选择。

● ● ●

Bottom line

AI agent 写代码这件事在过去一年已经成了日常。但"写数据管道"一直卡在最后一个环节:写完的代码谁来部署、调度、监控?

MotherDuck 的答案是:同一个 agent,通过同一个 MCP server,写完就能部署,部署完就能监控。从"AI 帮你写代码"到"AI 帮你运行代码"——这一步是数据工程 agent-native 化的分水岭。

motherduck.com/product/flights