mcpField
G
GoldenCheck

GoldenCheck

リモート
benseverndev-oss.github.ioデータ・分析226 週間前に更新
リポジトリ公式サイト

GoldenCheck について

GoldenCheckは表形式データから検証ルールを自動発見し、CLI、対話型TUI、TypeScriptインターフェースを提供します。開発者やデータチーム向けで、ベースライン比較や自動修正にも対応します。このリポジトリはアーカイブ済みで、開発はgoldenmatchモノレポに移っています。

主な機能

  1. 01データ検証の問題を自動発見
  2. 02対話型TUIで確認してルールを登録
  3. 03ベースライン分析とドリフト検出
  4. 04ファイル構造の比較と自動修正
  5. 05データベースのスキャンとREST API

活用シーン

  1. 01CSVの形式や外れ値を確認
  2. 02ベースラインからのデータ変化を監視
  3. 03データファイルの版を比較
  4. 04データベーステーブルを定期スキャン

MCP 対応

`goldencheck mcp-serve`コマンドで、19個のツールを備えたMCPサーバーを起動できます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://goldencheck-mcp-production.up.railway.app/mcp/
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
pypigoldencheck3.6.0

ツール

詳細

移行しました。 このリポジトリは benzsevern/goldenmatch モノレポ内の packages/python/goldencheck (and packages/typescript/goldencheck)/ に移行しました。このリポジトリはアーカイブされており、新規開発はモノレポで行われます。

GoldenCheck

データからルールを自動検出するため、ルールを自分で記述する必要がないデータ検証ツールです。 Ben Severn が開発しました。

PyPI npm CI codecov PyPI Downloads npm Downloads Python 3.11+ Node 20+ TypeScript License: MIT DQBench Docs Open In Colab

競合製品はどれも、まずルールを記述する必要があります。GoldenCheck はその逆です。まず検証し、必要なルールだけを残します。

GoldenCheck を選ぶ理由

GoldenCheckGreat ExpectationsPanderaPointblank
ルールデータから自動検出手動で記述手動で記述手動で記述
設定すぐに使い始められる大規模な YAML/Python の設定デコレーター/スキーマYAML/Python
インターフェースCLI + 対話型 TUIHTML レポート例外HTML/ノートブック
学習曲線コマンド 1 つ数時間〜数日中程度中程度
LLM による強化あり(スキャン 1 回あたり $0.01)なしなしなし
修正案あり(TUI 内)なしなしなし
信頼度スコアあり(検出結果ごとに H/M/L)なしなしなし
DQBench スコア88.4021.68(ベストエフォート)32.51(ベストエフォート)6.94(自動)

インストール

pip install goldencheck

LLM による強化をサポートする場合:

pip install goldencheck[llm]

詳細なプロファイリングとベースラインのサポートを利用する場合(scipy、numpy):

pip install goldencheck[baseline]

ベースラインのセマンティック型推論を利用する場合(sentence-transformers):

pip install goldencheck[baseline,semantic]
JavaScript / TypeScript
npm install goldencheck

エッジセーフなコア(ブラウザー、Cloudflare Workers、Vercel Edge):

import { scanData, TabularData } from "goldencheck/core";

Node.js(ファイル読み込み、CLI、MCP):

import { readFile, scanData } from "goldencheck/node";

クイックスタート

# Scan a file — discovers issues, launches interactive TUI
goldencheck data.csv

# CLI-only output (no TUI)
goldencheck data.csv --no-tui

# With LLM enhancement (requires API key)
goldencheck data.csv --llm-boost --no-tui

# Validate against saved rules (for CI/pipelines)
goldencheck validate data.csv

# JSON output for CI integration
goldencheck data.csv --no-tui --json

# Learn baseline (one-time, deep analysis)
goldencheck baseline data.csv

# Scan with drift detection (fast, uses saved baseline)
goldencheck scan new_data.csv

TypeScript クイックスタート

// Scan an array of records (edge-safe — works anywhere)
import { scanData, TabularData, Severity } from "goldencheck";

const data = new TabularData([
  { id: 1, email: "[email protected]", age: 30, status: "active" },
  { id: 2, email: "[email protected]", age: -5, status: "inactive" },
  { id: 3, email: "not-an-email", age: 25, status: "active" },
]);

const { findings, profile } = scanData(data);
for (const f of findings) {
  console.log(`[${f.severity === Severity.ERROR ? "ERROR" : "WARNING"}] ${f.column}: ${f.message}`);
}
// Scan a CSV file (Node.js)
import { readFile, scanData, applyConfidenceDowngrade, healthScore } from "goldencheck/node";

const data = readFile("data.csv");
const result = scanData(data, { domain: "healthcare" });
const findings = applyConfidenceDowngrade(result.findings, false);

// Health score
const byCol = {};
for (const f of findings) {
  if (f.severity >= 2) {
    byCol[f.column] ??= { errors: 0, warnings: 0 };
    byCol[f.column][f.severity === 3 ? "errors" : "warnings"]++;
  }
}
const { grade, points } = healthScore(byCol);
console.log(`Health: ${grade} (${points}/100)`);
// Validate against pinned rules
import { readFile, scanData, validateConfig, validateData } from "goldencheck/node";
import { readFileSync } from "node:fs";
import YAML from "yaml";

const config = validateConfig(YAML.parse(readFileSync("goldencheck.yml", "utf-8")));
const data = readFile("data.csv");
const findings = validateData(data, config);
// Create baseline and detect drift
import { readFile, createBaseline, serializeBaseline, scanData } from "goldencheck/node";
import { runDriftChecks, deserializeBaseline } from "goldencheck";
import { writeFileSync, readFileSync } from "node:fs";

// Learn baseline
const data = readFile("reference.csv");
const baseline = createBaseline(data);
writeFileSync("baseline.json", serializeBaseline(baseline));

// Later: detect drift
const newData = readFile("production.csv");
const saved = deserializeBaseline(readFileSync("baseline.json", "utf-8"));
const driftFindings = runDriftChecks(newData, saved);
// LLM-enhanced scanning (edge-safe)
import { scanData, TabularData, callLlm, parseLlmResponse, mergeLlmFindings, buildSampleBlocks } from "goldencheck";

const data = new TabularData(records);
const result = scanData(data, { returnSample: true });
const blocks = buildSampleBlocks(result.sample, result.findings);
const { text } = await callLlm("anthropic", JSON.stringify(blocks));
const llmResponse = parseLlmResponse(text);
if (llmResponse) {
  const enhanced = mergeLlmFindings(result.findings, llmResponse);
}

仕組み

1. SCAN     →  goldencheck data.csv
                GoldenCheck profiles your data and discovers what "healthy" looks like

2. REVIEW   →  Interactive TUI shows findings sorted by severity
                Each finding has: description, affected rows, sample values

3. PIN      →  Press Space to promote findings into permanent rules
                Dismiss false positives — they won't come back

4. EXPORT   →  Press F2 to save rules to goldencheck.yml
                Human-readable YAML with your pinned rules

5. VALIDATE →  goldencheck validate data.csv
                Enforce rules in CI with exit codes (0 = pass, 1 = fail)

検出できる項目

列レベルのプロファイラー
プロファイラー検出できる内容例
型推論実際には数値である文字列列「列 age は文字列型ですが、98% が整数です」
NULL 許容性必須列と任意列「5 万行すべてで NULL が 0 件です。必須列である可能性が高いです」
一意性主キー候補、ほぼ重複している値「100% 一意です。主キーである可能性が高いです」
形式の検出メールアドレス、電話番号、URL、日付「94% がメール形式で、6% は形式が正しくありません」
範囲と分布外れ値、最小値/最大値の範囲「10,000 を超える値が 3 行あります」
カーディナリティカーディナリティの低い列挙型の候補「一意な値が 4 つあります。列挙型の可能性があります」
パターンの一貫性列内の形式の混在「3 種類の電話番号形式が検出されました」
列間プロファイラー
プロファイラー検出できる内容
時間順序start_date > end_date の違反
NULL の相関同時に NULL になる列(例:address + city + zip)
数値列間の検査値 > 最大値の違反(例:claim_amount > policy_max)
年齢と生年月日年齢列の値が、date_of_birth から計算した年齢と一致しない
ベースラインの詳細プロファイリングとドリフト検出

goldencheck baseline を一度実行して、正常なデータの統計プロファイルを作成します。その後のスキャンでは毎回、GoldenCheck が新しいデータを保存済みのベースラインと比較し、13 種類のチェックでドリフトを報告します。

チェックの種類検出できる内容
distribution_drift値の分布が大幅に変化した
entropy_drift列の値のエントロピーが変化した
bound_violation値が過去の最小値/最大値の範囲を超えている
benford_drift先頭桁の分布がベンフォードの法則から逸脱している
fd_violation列間の関数従属性が崩れている
key_uniqueness_loss以前は一意だった列に重複が発生している
temporal_order_drift過去の列の順序制約に違反している
type_drift列の主要な意味型が変化した
correlation_break以前は相関していた列が相関しなくなった
new_correlation予期しない新たな相関が発生した
pattern_drift値の形式/パターンの分布が変化した
new_pattern列に新たな構造パターンが現れた

ベースラインは、次の 6 つの手法を使って作成されます:統計プロファイラー(分布、ベンフォードの法則、エントロピー)、制約マイナー(関数従属性、時間順序)、意味型推論器(埋め込み+キーワード)、相関アナライザー(ピアソン、Cramér の V)、パターン文法の帰納、信頼度事前分布の構築。

ドメインパック

ドメイン固有の型定義を使用して、検出精度を高めます。

goldencheck scan data.csv --domain healthcare   # NPI, ICD, insurance, patient types
goldencheck scan data.csv --domain finance      # accounts, routing, CUSIP, transactions
goldencheck scan data.csv --domain ecommerce    # SKUs, orders, tracking, products

ドメインパックは、偽陽性を減らし、業界固有のデータの分類精度を高める意味型を追加します。

スキーマ差分

データファイルの 2 つのバージョンを比較します。

goldencheck diff data.csv                  # compare against git HEAD
goldencheck diff old.csv new.csv           # compare two files
goldencheck diff data.csv --ref main       # compare against a branch

自動修正

自動修正を適用して、データをクリーンアップします。

goldencheck fix data.csv                          # safe: trim, normalize, fix encoding
goldencheck fix data.csv --mode moderate          # + standardize case
goldencheck fix data.csv --mode aggressive --force # + coerce types
goldencheck fix data.csv --dry-run                # preview changes

監視モード

データ品質を確認するために、ディレクトリを継続的に監視します。

goldencheck watch data/ --interval 30        # re-scan every 30s
goldencheck watch data/ --exit-on error      # CI mode: fail on first error

REST API

GoldenCheck をマイクロサービスとして実行します。

goldencheck serve --port 8000

# Scan via file upload
curl -X POST http://localhost:8000/scan --data-binary @data.csv

# Scan via URL
curl -X POST http://localhost:8000/scan/url -d '{"url": "https://example.com/data.csv"}'

データベーススキャン

テーブルを直接スキャンします。CSV へのエクスポートは不要です。

pip install goldencheck[db]
goldencheck scan-db "postgresql://user:pass@host/db" --table orders
goldencheck scan-db "snowflake://..." --query "SELECT * FROM orders WHERE date > '2024-01-01'"

定期実行

Webhook 通知に対応した Cron のようなスケジュール設定です。

goldencheck schedule data/*.csv --interval hourly --webhook https://hooks.slack.com/...
goldencheck schedule data/*.csv --interval daily --notify-on grade-drop

LLM による強化

--llm-boost を追加すると、LLM の能力を活用してプロファイラーの検出結果を強化できます。LLM はデータの代表的なサンプルを受け取り、次の処理を行います。

  1. プロファイラーが見逃す問題を検出 — 意味を理解して検出します(例:名前列にある「12345」)。
  2. 重大度を引き上げ — プロファイラーが「INFO」としか示さなくても、「メールアドレスは必須にすべき」と判断します。
  3. 関連性を発見 — signup_date と last_login のような列間の時間順序を特定します。
  4. 偽陽性の重大度を引き下げ — 「電話番号形式の混在はよくあることで、エラーではありません」と判断します。
# Using OpenAI
export OPENAI_API_KEY=sk-...
goldencheck data.csv --llm-boost --llm-provider openai --no-tui

# Using Anthropic
export ANTHROPIC_API_KEY=sk-ant-...
goldencheck data.csv --llm-boost --no-tui

コスト: 1 スキャンあたり約 0.01 ドル(行ごとではなく、代表的なサンプルを使った API 呼び出し 1 回)。

予算管理:

export GOLDENCHECK_LLM_BUDGET=0.50  # max spend per scan in USD

設定(goldencheck.yml)

version: 1

settings:
  sample_size: 100000
  fail_on: error

columns:
  email:
    type: string
    required: true
    format: email
    unique: true

  age:
    type: integer
    range: [0, 120]

  status:
    type: string
    enum: [active, inactive, pending, closed]

relations:
  - type: temporal_order
    columns: [start_date, end_date]

ignore:
  - column: notes
    check: nullability

このファイルに記載されるのはピン留めされたルールのみであり、すべての検出結果ではありません。ignore リストを使うと、却下した検出結果が再表示されなくなります。

CLI リファレンス

コマンド説明
goldencheck <file>スキャンして TUI を起動
goldencheck scan <file>明示的にスキャン(--smart、--guided に対応)
goldencheck validate <file>goldencheck.yml に照らして検証
goldencheck review <file>スキャンと検証を行い、TUI を起動
goldencheck init <file>対話式セットアップウィザード(スキャン → 設定 → CI)
goldencheck diff <file> [file2]2 つのファイル、またはファイルと git HEAD を比較
goldencheck watch <dir>ディレクトリをポーリングし、変更時に再スキャン
goldencheck fix <file>データ品質の問題を自動修正
goldencheck baseline <file>データを詳細にプロファイリングし、統計的ベースラインを YAML に保存
goldencheck learn <file>LLM 検証ルールを生成
goldencheck historyスキャン履歴と傾向を表示
goldencheck serveREST API サーバーを起動
goldencheck scan-db <conn>データベースのテーブルを直接スキャン
goldencheck schedule <files>cron スケジュールでスキャンを実行
goldencheck mcp-serveMCP サーバーを起動(19 個のツール)
フラグ
フラグ説明
--no-tui結果をコンソールに出力
--jsonJSON 出力
--fail-on <level>重大度が error または warning の場合に終了コード 1 を返す
--domain <name>ドメインパック:healthcare、finance、ecommerce
--llm-boostLLM による拡張を有効化
--llm-provider <name>LLM プロバイダー:anthropic(デフォルト)または openai
--mode <level>修正モード:safe、moderate、aggressive
--smart自動トリアージ:確信度が高いものをピン留めし、低いものを却下
--guided検出結果を 1 件ずつ確認
--webhook <url>検出結果を Slack/PagerDuty/任意の URL に POST
--notify-on <trigger>Webhook のトリガー:grade-drop、any-error、any-warning
--baseline <path>ドリフト検出に使うベースライン YAML のパス
--no-baselinegoldencheck_baseline.yaml の自動検出をスキップ
--skip <technique>ベースラインの手法をスキップ(複数指定可能)
--update上書きせず、既存のベースラインを更新
-o <path>ベースラインファイルの出力先(デフォルト:goldencheck_baseline.yaml)
--versionバージョンを表示

TypeScript CLI

npx goldencheck-js scan data.csv --json
npx goldencheck-js scan data.csv --domain healthcare
npx goldencheck-js health-score data.csv
npx goldencheck-js profile data.csv
npx goldencheck-js validate data.csv --config goldencheck.yml
npx goldencheck-js baseline data.csv --output baseline.json
npx goldencheck-js fix data.csv --mode safe
npx goldencheck-js diff old.csv new.csv
npx goldencheck-js demo

TypeScript アーキテクチャ

goldencheck (npm)
├── goldencheck/core    # Edge-safe: browsers, Workers, Edge Runtime
│   ├── types           # Finding, Severity, DatasetProfile, Config types
│   ├── data            # TabularData — zero-dep columnar abstraction
│   ├── profilers       # 10 column profilers + 4 relation profilers
│   ├── semantic        # Type classifier, suppression, 3 domain packs
│   ├── engine          # Scanner, confidence, validator, triage, differ, fixer
│   ├── baseline        # Statistical profiling, constraints, correlation, patterns
│   ├── drift           # 13 drift checks against saved baseline
│   ├── llm             # Anthropic + OpenAI via fetch(), merger, budget
│   ├── agent           # Strategy, handoff, review queue
│   └── reporters       # JSON, CI
└── goldencheck/node    # Node.js >= 20
    ├── reader          # CSV, Parquet (via nodejs-polars)
    ├── mcp             # MCP server (7 tools)
    ├── a2a             # Agent-to-Agent HTTP server
    ├── tui             # ANSI terminal output
    ├── db-scanner      # Postgres, MySQL, SQLite
    └── watcher         # Directory polling

ベンチマーク

速度
データセット時間スループット
1K rows0.05s19K rows/sec
10K rows0.23s43K rows/sec
100K rows2.29s44K rows/sec
1M rows2.07s482K rows/sec
DQBench v1.0 — 直接比較
ツールモードDQBench スコア
GoldenCheck設定不要88.40
Panderaベストエフォートのルール32.51
Soda Coreベストエフォートのルール22.36
Great Expectationsベストエフォートのルール21.68

GoldenCheck の設定不要の検出機能は、競合製品のすべてを上回ります。手書きのルールを使用した場合でも同様です。

ベンチマークを自分で実行するには:

pip install dqbench goldencheck
dqbench run goldencheck
検出精度
モード列の再現率コスト
プロファイラーのみ(v0.1.0)87%$0
プロファイラーのみ(確信度機能付き v0.2.0)100%$0
LLM による拡張あり100%~$0.003-0.01

9 つのカテゴリにわたる 341 件のデータ品質問題を仕込んだ独自のベンチマークでテストしました。

v0.2.0 の改善点:少数の誤った型の検出、範囲プロファイラーの連結、より幅広い時間的ヒューリスティクス、確信度スコアリングにより、プロファイラーのみの場合の再現率が 87% から 100% に向上しました。

Raha ベンチマークデータセット
データセット列の再現率
Flights(2,376 行)100%(4/4 列)
Beers(2,410 行)80%(4/5 列)

技術スタック

依存関係用途
Polarsすべてのデータ操作
TyperCLI フレームワーク
Textual対話型 TUI
RichCLI 出力のフォーマット
Pydantic 2設定の検証

オプション: LLM Boost 用の Anthropic SDK / OpenAI SDK | MCP サーバー用の MCP SDK | 詳細なベースラインプロファイリング用の scipy + numpy([baseline])| ベースラインでのセマンティック型推論用の sentence-transformers([semantic])

TypeScript / Node.js
依存関係用途
ランタイム依存関係なしコアパッケージに依存関係はありません(エッジセーフ)
nodejs-polarsParquet の読み込み(オプション、Node.js のみ)
csv-parseCSV の読み込み(Node.js のみ)
@modelcontextprotocol/sdkMCP サーバー(Node.js のみ)

MCP サーバー(Claude Desktop)

GoldenCheck には、Claude Desktop との統合用 MCP サーバーが含まれています。

pip install goldencheck[mcp]

Claude Desktop の設定(claude_desktop_config.json)に追加します。

{
  "mcpServers": {
    "goldencheck": {
      "command": "goldencheck",
      "args": ["mcp-serve"]
    }
  }
}

利用可能なツール:

ツール説明
scanファイルをスキャンしてデータ品質の問題を検出します(オプションで LLM による強化が可能)
validategoldencheck.yml の固定ルールに照らして検証します
profile列レベルの統計情報とヘルススコアを取得します
health_scoreデータファイルの簡易 A〜F 評価を取得します
get_column_detail特定の列を詳しく調査します
list_checks利用可能なすべてのプロファイラーチェックを一覧表示します

リモート MCP サーバー

GoldenCheck は Smithery でホスト型 MCP サーバーとして利用できます。インストールせずに、任意の MCP クライアントから接続できます。

Claude Desktop / Claude Code:

{
  "mcpServers": {
    "goldencheck": {
      "url": "https://goldencheck-mcp-production.up.railway.app/mcp/"
    }
  }
}

ローカルサーバー:

pip install goldencheck[mcp]
goldencheck mcp-serve

ファイルのスキャン、ルールの検証、列のプロファイリング、データセットのヘルススコア算出、検証の自動設定、調査結果の説明、ドメインの比較、修正案の提案を行う 19 個のツールを利用できます。

Jupyter / Colab

GoldenCheck は Jupyter ノートブックでリッチな HTML をレンダリングします。

from goldencheck.engine.scanner import scan_file
from goldencheck.engine.confidence import apply_confidence_downgrade
from goldencheck.notebook import ScanResult

findings, profile = scan_file("data.csv")
findings = apply_confidence_downgrade(findings, llm_boost=False)

# Rich HTML display in notebooks
ScanResult(findings=findings, profile=profile)

Colab で開く

API クイックリファレンス

Python
import goldencheck

# Scan a CSV for quality issues
findings = goldencheck.scan_file("data.csv")
for f in findings:
    print(f"[{f.severity}] {f.column}: {f.check} — {f.message}")

# Create baseline and detect drift
from goldencheck import create_baseline, scan_file
baseline = create_baseline("data.csv")
baseline.save("goldencheck_baseline.yaml")
findings, profile = scan_file("data.csv", baseline="goldencheck_baseline.yaml")

# Health score
score = goldencheck.health_score("data.csv")
print(score)  # e.g. "B (78/100)"
TypeScript
import { scanData, TabularData, Severity } from "goldencheck";

// Scan records (edge-safe)
const data = new TabularData(records);
const { findings, profile } = scanData(data);
for (const f of findings) {
  console.log(`[${f.severity === Severity.ERROR ? "ERROR" : "WARNING"}] ${f.column}: ${f.message}`);
}
import { readFile, scanData, applyConfidenceDowngrade, healthScore } from "goldencheck/node";

// Scan a CSV file (Node.js)
const data = readFile("data.csv");
const result = scanData(data, { domain: "healthcare" });
const findings = applyConfidenceDowngrade(result.findings, false);

// Health score
const byCol = {};
for (const f of findings) {
  if (f.severity >= 2) {
    byCol[f.column] ??= { errors: 0, warnings: 0 };
    byCol[f.column][f.severity === 3 ? "errors" : "warnings"]++;
  }
}
const { grade, points } = healthScore(byCol);
console.log(`Health: ${grade} (${points}/100)`);
import { readFile, createBaseline, serializeBaseline } from "goldencheck/node";
import { runDriftChecks, deserializeBaseline } from "goldencheck";
import { writeFileSync, readFileSync } from "node:fs";

// Create baseline and detect drift
const data = readFile("reference.csv");
const baseline = createBaseline(data);
writeFileSync("baseline.json", serializeBaseline(baseline));

const newData = readFile("production.csv");
const saved = deserializeBaseline(readFileSync("baseline.json", "utf-8"));
const driftFindings = runDriftChecks(newData, saved);

コントリビュート

開発環境のセットアップとガイドラインについては、CONTRIBUTING.md をご覧ください。

作者

Ben Severn

ライセンス

MIT — LICENSE をご覧ください。


Golden Suite の一部

ツール用途インストール
GoldenCheckデータ品質を検証・プロファイリングpip install goldencheck / npm install goldencheck
GoldenFlowデータを変換・標準化pip install goldenflow
GoldenMatchレコードの重複を排除・照合pip install goldenmatch
GoldenPipeパイプライン全体をオーケストレーションpip install goldenpipe

関連プロジェクト:

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。