Dataset Diff & Change Detector

io.github.Nero-Enginev0.1.0更新於 Oct 10, 2026

Compare two versions of a JSON row list: what was added, removed or changed, field by field.

已驗證Streamable HTTP可網頁執行Developer ToolsData & Analytics

概覽

AI 產生的概覽

比較同一份 JSON 資料列清單的兩個版本,逐欄位回報哪些資料列被新增、刪除或修改。

功能
提供 diff_rows 工具,接收變更前快照(oldRows)與變更後快照(newRows),依一個或多個鍵欄位(例如 sku、id)配對資料列,並比較除 ignoreFields 以外的所有欄位,或只比較指定的 compareFields。它會針對每筆差異回傳 status、key、oldValues、newValues 與 changedFields,並附上新增、刪除、修改與未變更資料列的彙總計數。list_capabilities 工具說明配對與比較規則、輸出結構與資料列上限,且不處理資料。比較是精確的,因此文字與數字、大小寫或空白差異,以及 null 變成具體值,都會算作變更。
適用情境
適合需要比較同一份資料集兩份匯出檔的情境,例如昨天與今天的價格表、兩份商品資料來源,或兩份 CRM 匯出,並精確回報變動內容。適用於中小規模的資料列清單,需要精確到欄位的變更報告,而非模糊比對時。
執行需求
遠端 streamable HTTP 端點;未宣告需要安裝、API 金鑰或註冊。用戶端連線至伺服器 URL 即可。每次呼叫 oldRows 與 newRows 合計最多 500 列;更大的清單需拆分多次呼叫,並確保每次呼叫兩側使用相同的鍵範圍。
安裝前請注意
資料列會傳送到第三方遠端服務,除非可以接受,否則應避免提交機密資料。README 表示資料列僅在記憶體中處理且不儲存,每次呼叫會記錄工具名稱、列數、是否成功、用戶端名稱、國家及單向雜湊的呼叫方 ID,但不記錄資料、參數或 IP 位址。此服務在早期存取階段免費,可用性與條款可能變動。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Dataset Diff & Change Detector,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "dataset-diff-detector": {
      "type": "http",
      "url": "https://dataset-diff-detector.nerolabs.workers.dev/mcp"
    }
  }
}

README

Dataset Diff & Change Detector (Remote MCP Server)

Compare two versions of the same list of JSON rows and get exactly what changed. Hand it yesterday's price list and today's, last week's product feed and this week's, or two exports of the same CRM, name the field that identifies a row, and it tells you which rows were added, removed or changed, down to which fields moved on each one.

Built for AI agents. No install, no API key, no signup. Connect by URL and call it.

https://dataset-diff-detector.nerolabs.workers.dev/mcp

Free to use while in early access.

What it does

One call compares a before snapshot (oldRows) with an after snapshot (newRows):

  1. Matches rows across the two sides on keyFields, such as sku, id or email (one field or several). Without a key it matches on full row content, so an edited row shows as one removed row plus one added row.
  2. Compares every field on each matched pair, minus any ignoreFields (timestamps that always differ), or only the compareFields you name.
  3. Returns one row per difference with its status, key, oldValues, newValues and changedFields, plus a summary counting added, removed, changed and unchanged rows. Turn on includeUnchanged to get the unchanged rows back too.

Comparison is exact, so nothing is quietly glossed over: "24.99" as text and 24.99 as a number count as a change, as do "Blue" and "blue ", and null becoming a value. Nested objects compare by value, whatever order their keys are in.

It is honest about messy input. The summary warns when a key value appears twice on one side (the last row is kept and the count is reported), when rows have no key field at all, and when a field you named appears in no row, which is usually a typo.

Tools

ToolWhat it does
list_capabilitiesLists the exact matching and comparison rules, the output shape and the row limit. Processes no data.
diff_rowsCompares oldRows with newRows and returns the differences plus a summary.

Connect

Claude Code

bash
claude mcp add --transport http dataset-diff-detector https://dataset-diff-detector.nerolabs.workers.dev/mcp

Claude Desktop / claude.ai: Settings, Connectors, Add custom connector, paste the URL above.

Cursor, Windsurf, VS Code and other MCP clients

json
{  "mcpServers": {    "dataset-diff-detector": {      "url": "https://dataset-diff-detector.nerolabs.workers.dev/mcp"    }  }}

Example

Yesterday's and today's price list go in, with the scrape timestamp ignored:

json
{  "oldRows": [    {"sku": "A100", "title": "Blue Widget", "price": 19.99, "stock": 42, "scrapedAt": "2026-09-11T08:00:00Z"},    {"sku": "A101", "title": "Red Widget", "price": "24.99", "stock": 0, "scrapedAt": "2026-09-11T08:00:00Z"},    {"sku": "A102", "title": "Green Widget", "price": 15.5, "stock": 8, "scrapedAt": "2026-09-11T08:00:00Z"},    {"sku": "A104", "title": "Purple Widget", "price": 9.99, "discount": null, "scrapedAt": "2026-09-11T08:00:00Z"},    {"sku": "A105", "title": "Orange Widget", "price": 30, "stock": 3, "scrapedAt": "2026-09-11T08:00:00Z"}  ],  "newRows": [    {"sku": "A100", "title": "Blue Widget", "price": 17.99, "stock": 30, "scrapedAt": "2026-09-12T08:00:00Z"},    {"sku": "A101", "title": "Red Widget", "price": 24.99, "stock": 0, "scrapedAt": "2026-09-12T08:00:00Z"},    {"sku": "A102", "title": "Green Widget", "price": 15.5, "stock": 8, "scrapedAt": "2026-09-12T08:00:00Z"},    {"sku": "A104", "title": "Purple Widget", "price": 9.99, "discount": 0.1, "scrapedAt": "2026-09-12T08:00:00Z"},    {"sku": "A106", "title": "Yellow Widget", "price": 12, "stock": 100, "scrapedAt": "2026-09-12T08:00:00Z"}  ],  "keyFields": ["sku"],  "ignoreFields": ["scrapedAt"]}

Five differences come out. A105 was removed, A106 was added, A100 changed price and stock, A101's price turned from text into a number, and A104 gained a discount. A102 matched exactly and is counted as unchanged:

json
{  "rows": [    {"status":"removed","key":{"sku":"A105"},"oldValues":{"sku":"A105","title":"Orange Widget","price":30,"stock":3,"scrapedAt":"2026-09-11T08:00:00Z"}},    {"status":"changed","key":{"sku":"A100"},"oldValues":{"sku":"A100","title":"Blue Widget","price":19.99,"stock":42,"scrapedAt":"2026-09-11T08:00:00Z"},"newValues":{"sku":"A100","title":"Blue Widget","price":17.99,"stock":30,"scrapedAt":"2026-09-12T08:00:00Z"},"changedFields":["price","stock"]},    {"status":"changed","key":{"sku":"A101"},"oldValues":{"sku":"A101","title":"Red Widget","price":"24.99","stock":0,"scrapedAt":"2026-09-11T08:00:00Z"},"newValues":{"sku":"A101","title":"Red Widget","price":24.99,"stock":0,"scrapedAt":"2026-09-12T08:00:00Z"},"changedFields":["price"]},    {"status":"changed","key":{"sku":"A104"},"oldValues":{"sku":"A104","title":"Purple Widget","price":9.99,"discount":null,"scrapedAt":"2026-09-11T08:00:00Z"},"newValues":{"sku":"A104","title":"Purple Widget","price":9.99,"discount":0.1,"scrapedAt":"2026-09-12T08:00:00Z"},"changedFields":["discount"]},    {"status":"added","key":{"sku":"A106"},"newValues":{"sku":"A106","title":"Yellow Widget","price":12,"stock":100,"scrapedAt":"2026-09-12T08:00:00Z"}}  ],  "summary": {    "oldRecordCount": 5,    "newRecordCount": 5,    "counts": {"added": 1, "removed": 1, "changed": 3, "unchanged": 1},    "differenceCount": 5,    "returnedRowCount": 5,    "unchangedRowsIncluded": false,    "keyFieldsUsed": ["sku"],    "ignoreFields": ["scrapedAt"],    "duplicateRowsSkipped": {"old": 0, "new": 0},    "rowsMissingKeyFields": {"old": 0, "new": 0},    "warnings": []  }}

Removed rows come first, then changed rows in the order of oldRows, then added rows in the order of newRows.

Limits

Up to 500 rows per call, oldRows and newRows combined. For bigger lists, split them across several calls and keep the same key range on both sides of each call (for example SKUs A to M in one call, N to Z in the next), otherwise a row in one call looks removed while its match in another looks added. Anything larger returns a clear message rather than failing silently.

Privacy

Your rows are processed in memory and never stored. To see which tools get used, each call records the tool name, row counts, whether it succeeded, the client name your app reports, the country and a one-way hashed caller ID. Your data, your arguments and your IP address are never kept in that log.

Also available

The same engine runs on the Apify Store as Dataset Diff & Change Detector, which adds "since last run" snapshot mode (name a comparison and every run reports only what changed since the previous one, so you never supply the old side again), reads Apify datasets, CSV, Excel and JSON files and Google Sheets on either side, compares up to 100,000 rows a run, exports a CSV or Excel diff report, keeps a running change log in a named dataset, and posts each result to a webhook.

Built by Nero Labs.

來源:README.md,提交 a12ca03

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v0.1.0最新Sep 16, 2026