mcpField
S
Scherlok

Scherlok

本地服务
github.com/rbmuller数据与分析111 周前更新

关于 Scherlok

Scherlok 是数据质量监控服务和命令行工具,可学习数据库表的基线并检测异常,无需预先编写规则或设置阈值。它支持数据库与 dbt 工作流,并可向团队和 CI 流水线发送告警。

主要功能

  1. 01学习表结构与数据基线
  2. 02检测数据量、新鲜度、结构和数值变化
  3. 03通过 Webhook、邮件或 CI 状态告警
  4. 04分析 dbt 模型并设为流水线门禁
  5. 05生成独立 HTML 仪表板

适用场景

  1. 01发现数据仓库表的意外变化
  2. 02检测到严重异常时使 CI 失败
  3. 03在 dbt 运行后监控模型
  4. 04通过 HTML 报告查看异常历史

MCP 相关

Scherlok 的 MCP 服务提供列出表、分析数据、监测异常以及查看状态和历史的工具。对数据仓库的操作为只读,凭据由服务端解析,且不提供任意 SQL 工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"rbmuller-scherlok": {
"command": "uvx",
"args": [
"scherlok"
],
"env": {
"SCHERLOK_CONNECTION": "<SCHERLOK_CONNECTION>"
}
}
}
}
启动命令uvx scherlok
需要配置的环境变量
SCHERLOK_CONNECTION密钥Warehouse connection string (postgresql://, bigquery://, snowflake://, mysql://, duckdb:///path). Resolved server-side; never passed by the model.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypischerlok1.0.5

工具

6

收录的工具列表 · 更新于 1 周前

此工具无需参数。

详细介绍

Python 3.10+ PyPI PyPI 下载量 MIT 许可证 CI Glama 评分 MCP 注册表 文档



Scherlok

Scherlok

为数据库表提供零配置异常检测。
无需 YAML、规则或阈值。Scherlok 会学习“正常”是什么样子,然后在情况发生变化时通知你。

pip install scherlok
scherlok ci postgres://user:pass@host/db   # profiles on the first run, detects anomalies on every run after

手头没有数据库?演示会创建数据库、学习其模式、制造异常并将其捕获,整个过程大约只需一秒:

uvx --from "scherlok[duckdb]" scherlok demo
Scherlok 演示

适用于 PostgreSQL、BigQuery、Snowflake、MySQL、DuckDB 和 dbt。告警可发送到 Slack、Discord、Teams、电子邮件,或通过 CI 退出代码发出。


问题

每个数据团队都面临同样的噩梦:

某个源 API 悄无声息地把美元改成了美分。收入仪表板上的数字错了,3 周后才有人发现。

某列开始返回 NULL。某张表停止更新。某个星期二,行数下降了 40%。直到 CEO 问报告为什么看起来不对劲,才有人发现。

现有工具(Great Expectations、Soda、dbt tests)要求你先定义“正确”是什么样子,才能检测出问题。数百条规则、数十个 YAML 文件。而你仍会漏掉问题——因为你无法为尚未想到的问题编写规则。

可捕获的异常

异常发生情况严重级别
数据量骤降行数在一夜之间下降了 40%CRITICAL
数据量激增行数是正常值的 3 倍WARNING
新鲜度告警表已有 12h 未更新(通常每 2h 更新一次)CRITICAL
架构漂移列被移除或类型发生变化CRITICAL
NULL 激增NULL 比率从 2% 跃升至 45%WARNING
分布偏移列均值偏移了 3 个或更多标准差(Shewhart 式控制限)INFO,高于 5σ 时为 WARNING
基数激增状态列的取值从 5 个增至 500 个CRITICAL

每个异常都会自动评定级别:INFO、WARNING 或 CRITICAL。无需配置阈值。

工作原理

Scherlok 采用与基于规则的工具相反的方法:先学习,再检测。

scherlok connect postgres://user:pass@host/db   # connect once
scherlok investigate                              # learn your data
scherlok watch                                    # detect anomalies

三条命令,五分钟,搞定。(对于流水线,scherlok ci <url> 会一步运行全部三条命令。)

积累五个有效的配置文件后,Scherlok 会基于最新的 30 个配置文件,使用稳健的历史基线学习各项指标的变化范围,涵盖数据量、数值均值偏移、NULL 比率和不同值计数。在冷启动阶段或历史数据不可用时,则沿用保守的固定默认值。

1. investigate — 学习模式
$ scherlok investigate

  Profiling 12 tables...
  ✓ users         — 45,231 rows, 8 columns
  ✓ orders        — 1,203,847 rows, 15 columns
  ✓ products      — 892 rows, 12 columns
  ...
  Done. Profiles saved.

Scherlok 会分析每张表的配置:行数、列类型、NULL 比率、值分布、更新频率和基数,并将所有数据存储在本地 SQLite 中。

2. watch — 检测异常
$ scherlok watch

  Checking 12 tables against learned profiles...

  🔴 CRITICAL  orders    volume_drop     Row count dropped 52% (1,203,847 → 578,412)
  🟡 WARNING   users     null_increase   Column "email": NULL rate 2.1% → 18.7%
  🔵 INFO      products  distribution    Column "price": mean shifted 3.2σ

  3 anomalies detected. Exit code: 1
3. 告警 — Slack、CI/CD,或两者兼有
# Slack
scherlok watch --webhook https://hooks.slack.com/services/...

# Discord
scherlok watch --webhook https://discord.com/api/webhooks/...

# Microsoft Teams
scherlok watch --webhook https://outlook.office.com/webhook/...

# Any endpoint (generic JSON payload)
scherlok watch --webhook https://my-api.com/alerts

# CI/CD gate (fails pipeline on CRITICAL)
scherlok watch --exit-code --fail-on critical

根据 URL 自动检测 Slack、Discord 和 Teams,并据此设置载荷格式。其他 URL 会收到通用 JSON 载荷。

CI/CD 集成

将 Scherlok 用作数据质量关卡。ci 命令只需一行即可完成:

# GitHub Actions
- name: Data quality check
  run: |
    pip install scherlok
    scherlok config --store s3://my-bucket/scherlok/profiles.db
    scherlok ci ${{ secrets.DATABASE_URL }} \
      --webhook ${{ secrets.SLACK_WEBHOOK }} \
      --fail-on critical

如果 Scherlok 检测到严重异常,流水线就会失败。坏数据绝不会进入生产环境。

与 dbt 搭配使用

已经在运行 dbt?Scherlok 可通过自动异常检测补充 dbt test,无需编写规则。

pip install scherlok[dbt]

# After `dbt run`, point Scherlok at your project
scherlok dbt --project-dir ./my_dbt_project

Scherlok 会读取 target/manifest.json,发现每个已物化模型(table、incremental、view),从 profiles.yml 自动解析连接,并分析每个模型:

Investigating 4 dbt models in ./my_dbt_project (postgres)
  ✓ stg_customers                  (12,345 rows)
  ✓ stg_orders                     (98,765 rows)
  ✗ fct_orders                     CRITICAL: Row count dropped 42% (98,765 → 57,283)
  ✓ dim_customers_inc              (12,300 rows)

Summary: 4 profiled, 1 anomalies (1 critical, 0 warning)

在 dbt run 后将其用作 CI 关卡:

- run: dbt run --target prod
- run: scherlok dbt --project-dir . --target prod --fail-on critical

也可以用包装器将两个步骤合并为一步:

- run: scherlok dbt-run-and-watch --project-dir . --target prod --fail-on critical

包装器默认运行 dbt run,并使用记录在 target/run_results.json 中的成功模型节点,因此部分运行时只会分析 dbt 实际构建的模型。使用 --build 可运行 dbt build;如果测试失败导致后续模型被跳过,但 dbt 通过处理失败路径(退出码为 1)正常结束,成功模型仍会接受分析,同时包装器会保留 dbt build 的退出码。未处理的失败会立即终止,不会读取构建产物。

dbt 和 dbt-run-and-watch 都接受 --output json,供 CI 解析器使用——stdout 上只输出一个 JSON 文档,不输出其他内容。

支持的适配器:postgres、bigquery、snowflake、mysql、duckdb。其他适配器请显式传入 --connection-string。

📖 完整文档:dbt 集成指南 →

dbt Package — 原生测试

更喜欢留在 dbt 中?将 Scherlok 安装为 dbt Package,即可使用原生数据质量测试,无需 Python CLI。

# packages.yml
packages:
  - git: https://github.com/rbmuller/scherlok.git
    revision: v1.0.5

dbt Package Hub 列表发布后(dbt-labs/hubcap#456),这里将改为 package: rbmuller/scherlok,并使用 version: [">=1.0.0", "<2.0.0"]。

# schema.yml
models:
  - name: fct_orders
    tests:
      - scherlok.volume_anomaly:
          sensitivity: 3.0
      - scherlok.row_count_between:
          min_value: 100
    columns:
      - name: email
        tests:
          - scherlok.not_null_proportion:
              max_rate: 0.01
      - name: updated_at
        tests:
          - scherlok.recency:
              days: 2

第 1 层 — 即时检测(无需设置):not_null_proportion、row_count_between、recency、unique_proportion

第 2 层 — 自动学习(Shewhart 控制限):volume_anomaly、null_anomaly——需要构建 scherlok_metrics 模型来生成基线历史数据。

📖 完整文档:dbt Package README →

HTML 仪表板

scherlok 仪表板

scherlok dashboard --out report.html

一个独立的 HTML 文件(约 28 KB):包含 KPI、按表分组并标注首次发现时间的事件、使用 +/−/~ 标记的架构漂移差异、迷你趋势图和完整的异常历史记录。通过 prefers-color-scheme 自动切换深色/浅色主题。

📖 完整文档:仪表板指南 →

在 AI Agent 中使用(MCP)

让 Claude Code / Claude Desktop 直接运行数据质量检查。

**Claude Desktop:**从最新版本下载 scherlok-<version>.mcpb 并打开。只需单击一次,并设置一个选项(连接字符串会作为密钥存储)。

其他客户端:

pip install scherlok   # scherlok-mcp ships built-in since v0.7.0
{
  "mcpServers": {
    "scherlok": {
      "command": "scherlok-mcp",
      "env": { "SCHERLOK_CONNECTION": "postgresql://user:pass@host/db" }
    }
  }
}

Agent 可将 list_tables、investigate、watch、status、history 和 check 用作工具。凭据由服务端解析(绝不会传给模型),所有操作对数据仓库均为只读,并且不提供任意 SQL 工具。

📖 完整文档:MCP 服务指南 →

AI 解释告警(--explain)

告警会告诉你发生了什么。--explain 会补充为什么发生,以及接下来该检查什么。

pip install 'scherlok[explain]'
export ANTHROPIC_API_KEY=sk-ant-...

scherlok watch --webhook https://hooks.slack.com/... --explain

发生异常时,Scherlok 会针对整批异常只调用一次 Claude,并在同一条 Slack/Discord/Teams/电子邮件/JSON 告警中附上一段简短的根因假设:

scherlok watch --explain:异常表格后接 AI 假设面板

适用于 watch、ci、check、dbt 和 dbt-run-and-watch。对于 dbt 项目,假设会感知数据血缘:manifest.json 中的上游父模型会加入提示词,因此级联故障会追溯到源模型,而不是对每个下游症状分别告警。

  • 费用——每次触发的运行调用一次(而非每个异常调用一次),默认使用 Claude Haiku 4.5:每次运行远低于 1 美分(约 $0.003)。可通过 SCHERLOK_EXPLAIN_MODEL 更换模型。没有异常的运行不会调用 API。
  • 发送内容——仅汇总信息:告警中已有的异常类型/严重程度/消息字符串、dbt 模型名称和检测时间戳。绝不会发送数据仓库行、单元格值或凭据——测试套件将此作为约束进行验证。
  • 关闭方式——此功能默认不启用;不要传入 --explain。如果 API 调用失败(缺少密钥、超时、达到速率限制),系统会照常发送原始告警,并附上一行说明。告警绝不会因等待大模型而阻塞。

📖 完整文档:解释器指南 →

电子邮件告警

export SCHERLOK_SMTP_HOST=smtp.gmail.com
export [email protected]
export SCHERLOK_SMTP_PASSWORD=app-specific-password

scherlok watch --email [email protected] --email [email protected]

连接器

# PostgreSQL
scherlok connect postgres://user:pass@host:5432/db

# BigQuery — see src/scherlok/connectors/bigquery.md for auth, billing, CI patterns
pip install scherlok[bigquery]
scherlok connect bigquery://project-id/dataset-name

# Snowflake
pip install scherlok[snowflake]
export SNOWFLAKE_USER=...
export SNOWFLAKE_PASSWORD=...
export SNOWFLAKE_WAREHOUSE=...
scherlok connect snowflake://account/database/schema

# MySQL
pip install scherlok[mysql]
scherlok connect mysql://user:pass@host:3306/dbname

# DuckDB
pip install scherlok[duckdb]
scherlok connect duckdb:///path/to/file.db
数据库状态
PostgreSQL可用
BigQuery可用
Snowflake可用
MySQL可用
DuckDB可用

远程存储

在 CI 运行和团队成员之间共享配置文件:

# AWS S3
scherlok config --store s3://my-bucket/scherlok/profiles.db

# Google Cloud Storage
scherlok config --store gs://my-bucket/scherlok/profiles.db

# Azure Blob Storage
scherlok config --store az://my-container/scherlok/profiles.db

对比

ScherlokElementarySodaGreat ExpectationsMonte Carlo
开源核心MITApache-2.0 dbt 包 + CLIApache-2.0 Soda CoreApache-2.0 GX Core否(SaaS)
检测开始前的配置无每个异常测试都需配置 YAMLSodaCL YAML 检查项声明的期望在产品中配置监控项
免费层可学习基线是,自动学习是,需逐项配置否(需要 Soda Library + Cloud)否(验证已声明的期望)不适用
无需 dbt 即可运行是否是是是
可自托管是开源版可自托管;Cloud 为托管服务Core 可自托管;Cloud 为托管服务Core 可自托管;Cloud 为托管服务否
定价免费开源版免费;Cloud 按席位和环境收费Core 免费;Cloud 提供免费方案Core 免费;Cloud 提供免费的 Developer 选项按报价定价

每项对比均链接到其他工具自己的文档,详见完整对比。

CLI 参考

scherlok connect <url>          Connect to a database
scherlok investigate            Profile all tables (learn patterns)
scherlok watch [-w <url>] [-e <email>]  Detect anomalies and alert
scherlok ci <url> [opts]        All-in-one CI/CD command (connect + watch + exit code)
scherlok dbt [--project-dir .] [--output json]  Profile dbt models from manifest
scherlok dbt-run-and-watch [--build] [--output json]  Run dbt + profile in one step
scherlok status [--output json] Quick health dashboard
scherlok history [--days N] [--output json]  Timeline of past anomalies
scherlok report [--output json] Detailed profile summary
scherlok dashboard [--out .html] Generate self-contained HTML report
scherlok config --store <url>   Set remote storage
scherlok demo [--keep] [--output json]  Self-contained demo on a sample DuckDB (no database needed)
scherlok version                Show version

安装

pip install scherlok

# With BigQuery support
pip install scherlok[bigquery]

需要 Python 3.10+。

通过 Docker 运行

每次发布标签时,都会将包含所有数据仓库扩展(dbt、bigquery、snowflake)的预构建镜像发布到 GitHub Container Registry:

docker run --rm ghcr.io/rbmuller/scherlok:latest version

挂载项目目录,并像在 CI 中一样注入连接详情;入口点是 scherlok CLI:

docker run --rm \
  -v "$PWD:/work" -w /work \
  -e SCHERLOK_CONNECTION=postgres://... \
  ghcr.io/rbmuller/scherlok:latest watch

该镜像基于 python:3.12-slim 构建,并以非特权用户身份运行(USER scherlok)。

贡献

欢迎贡献!请参阅 CONTRIBUTING.md。

我们尤其欢迎以下贡献:

  • 新的数据库连接器(例如 Databricks,参见 #37)
  • 异常检测改进
  • 文档和示例

Star 历史

Star 历史图表

许可证

MIT — 由 Robson Bayer Müller 开发

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。