构建 AI 原生数据发现的 MCP 服务器:Rust Crates 生态系统:第一部分

发布: (2025年12月4日 GMT+8 19:53)
7 min read
原文: Dev.to

Source: Building an MCP Server for AI‑Native Data Discovery – Rust Crates Ecosystem (Part I)

请提供您希望翻译的正文内容,我将为您翻译成简体中文。

介绍

传统的数据探索依赖预定义的查询——SQL 代码、仪表盘或商业智能工具。
如果你能够以对话式的方式探索数据仓库,提出开放性的问题,让 AI 发现你从未想到的模式,会怎样?

**模型上下文协议(Model Context Protocol,MCP)**使这一切成为可能。我构建了一个用于分析 Rust 生态系统的 MCP 服务器,并让 Claude 对其进行探索,回答有关 crates、依赖关系和趋势的问题。

如果你想跟进整个过程,请查看完整项目的 Rust Crates Analytics Repo

理解 crates.io 数据

当你下载并解压 crates.io DB 转储(参见 README 中的 download link),你会得到:

  • 一个带有本地加载说明的 PostgreSQL 转储。
  • 一个包含 CSV 文件的 data 文件夹,这些文件代表实际内容。

实体概览

实体描述
crates发布到 crates.io 的 Rust 包
versionscrate 的特定发布(例如 serde v1.0.228
categories分类学分类(例如 science::bioinformatics
keywords用于可发现性的用户自定义标签(例如 cargosql
teams可以拥有 crate 的组织账户(GitHub)
users个人开发者账户(GitHub)

事实表

  • version_downloads – 每个版本每日的时间序列下载计数(仅最近 3 个月)。
  • crate_downloads – 每个 crate 的累计总下载计数。

关联表

  • crates_categories – 将 crate 与分类关联。
  • crate_owners – 将 crate 与用户或团队关联。
  • crates_keywords – 将 crate 与关键词关联。
  • dependencies – 将版本与其依赖的 crate 关联。

支持表

  • metadata – 包含一行 total_downloads
  • reserved_crate_names – 受保护/不可用的 crate 名称列表。
  • default_versions – 将 crate 与其默认版本关联。

历史数据

  • version_downloads 表仅保留最近三个月的数据。
  • 旧的每日 CSV 转储(可在 crates.io 网站上获取)包含 version_iddownloads 列;日期需从文件名中推断。
  • 其他所有表都表示转储时生态系统的状态(例如 crates.created_atcrates.updated_at)。

关键要点

  • DB 转储每天刷新,反映下载时的生态系统状态。
  • 每天会有一天的数据从三个月窗口中移除,并放入 CSV 档案。
  • 对于分析而言,最重要的表是 cratesversionsversion_downloadsdependencies

Source:

架构概览

ELT 管道设计

层级目的
raw直接从 crates.io 转储的 CSV 加载
staging已清洗和验证的数据(表名前缀为 stg_
marts面向分析的表(本文未涉及)

Extract

  • 下载 crates.io 数据库转储文件(.tar.gz)。
  • 从压缩包中解压 CSV 文件。

Load

  • 使用 全量刷新 策略将 所有 CSV 导入 raw schema。
  • 每次新的转储都会替换原有的 raw 表,提供当前状态的干净快照。

Transform

  • staging schema 中应用数据质量规则:
    • 将所有时间戳统一规范为 UTC。
    • 增量 加载 stg_version_downloads(仅添加新日期)。
      • 第一次运行时摄取所有可用日期。
      • 随后运行仅添加新出现的数据。
    • 对维度表(categoriescratesversions 等)执行 全量刷新,以捕获更新。
    • 强制执行数据契约并运行质量测试。

这种方法能够高效处理三个月滚动窗口,同时在 stg_version_downloads 中保留完整的历史归档。

回填历史下载数据

  • 历史归档自 2014‑11‑11 起可用。
  • 回填脚本(通过起止日期参数化)直接将旧 CSV 导入 stg_version_downloads
  • 同时对 cratesdependenciesversions 进行快照,以捕获转储之间的变更。

约束与技术栈

约束解决方案
无基础设施开销DuckDB – 嵌入式、单文件 OLAP 数据库
跨平台Python + uv(快速包管理器)
快速迭代dbt 用于 SQL 转换、测试和快照
存储高效DuckDB 文件约 10 GB,数据覆盖 2014‑11‑11 至 2025‑11‑29;可在笔记本电脑上运行(≈8 GB RAM,≈20 GB 可用磁盘)
可视化Streamlit 用于快速数据验证仪表盘

所有项目依赖均通过 uv 管理;唯一的前置条件是已安装 uv

Source:

调查孤立版本

一个有趣的数据质量检查涉及 stg_version_downloads 表中的 孤立版本——即 version_idversions 表中不存在的记录。

调查步骤

  1. 识别孤立行

    SELECT vd.version_id
    FROM stg_version_downloads vd
    LEFT JOIN stg_versions v
      ON vd.version_id = v.id
    WHERE v.id IS NULL
    LIMIT 100;
  2. 量化问题规模

    SELECT COUNT(*) AS orphan_count
    FROM stg_version_downloads vd
    LEFT JOIN stg_versions v
      ON vd.version_id = v.id
    WHERE v.id IS NULL;
  3. 根本原因分析

    • 孤立记录通常来源于在下载快照之后被 撤回(yanked)或 删除 的 crate。
    • 三个月的窗口期可能包含了已不再存在于当前 versions 表中的版本的下载记录。
  4. 解决方案

    • 为了保持历史完整性,可保留孤立行,但在下游分析中对其进行标记。
    • 也可以维护一个单独的 “历史版本” 表,用于存储被撤回/删除版本的元数据。

该检查已成为自动化 dbt 测试的一部分,确保未来的加载能够捕获任何新的孤立记录。

结论

通过将轻量级 ELT 管道(Python + uv + DuckDB + dbt)与 Model Context Protocol 相结合,您可以将 Rust crates.io 数据集转化为可供 AI 探索的知识库。

  • 资源高效:该架构遵循严格的资源约束。
  • 历史深度:保留了下载量和依赖关系的完整时间视图。
  • 分析能力:支持诸如孤立版本检测以及更广泛生态系统分析等调查。
Back to Blog

相关文章

阅读更多 »