Diffgrab について
Diffgrabは、Webページの更新を監視する開発者や調査者向けの変更追跡ツールです。セクション単位の構造化差分を生成し、SQLiteにスナップショット履歴を保存します。snapgrabによる画面比較にも対応しています。
主な機能
- 01Webページの内容変更を検出
- 02統一差分とセクション分析の生成
- 03読みやすい変更概要の作成
- 04SQLiteへのスナップショット履歴保存
- 05オプションの画面差分比較
活用シーン
- 01ページの新規公開内容の監視
- 02変更されたセクションと行の確認
- 03ページの過去バージョンの確認
- 04スクリーンショット間の見た目の比較
MCP 対応
DiffgrabのMCPサーバーは、URLの登録、変更確認、構造化差分の取得、スナップショット履歴の閲覧、追跡停止を行う5種類のツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
diffgrab
構造化差分によるウェブページの変更追跡です。markgrab + snapgrab を統合し、MCP ネイティブに対応しています。
from diffgrab import DiffTracker
tracker = DiffTracker()
await tracker.track("https://example.com")
changes = await tracker.check()
for c in changes:
if c.changed:
print(c.summary) # "3 lines added, 1 lines removed in sections: Introduction."
print(c.unified_diff) # Standard unified diff output
await tracker.close()
特長
- 変更検出 — 任意の URL を追跡し、コンテンツハッシュによってコンテンツの変更を検出します
- 構造化差分 — 統合差分 + セクション単位の分析(変更された見出しを確認できます)
- 人が読みやすい要約 — 「セクション Intro、Methods で 5 行追加、2 行削除」
- スナップショット履歴 — SQLite に保存し、任意のページの過去のバージョンを閲覧できます
- markgrab を活用 — markgrab による HTML/YouTube/PDF/DOCX の抽出
- 視覚的な差分 — snapgrab によるスクリーンショット比較(任意)
- MCP サーバー — Claude Code/MCP クライアント向けの 5 つのツール
- CLI を同梱 —
diffgrab track、check、diff、history、untrack
仕組み
flowchart TD
A["diffgrab track URL"] --> B["Fetch initial snapshot\n(markgrab + snapgrab)"]
B --> C["Store baseline"]
C --> D["diffgrab check"]
D --> E["Fetch current page"]
E --> F{"Content\nhash match?"}
F -->|"changed"| G["Compute structured diff\n+ section analysis"]
F -->|"unchanged"| H["No changes"]
G --> I["📊 DiffResult\nadded / removed / modified"]
インストール
pip install diffgrab
オプションの追加機能:
pip install 'diffgrab[cli]' # CLI with click + rich
pip install 'diffgrab[visual]' # Visual diff with snapgrab
pip install 'diffgrab[mcp]' # MCP server with fastmcp
pip install 'diffgrab[all]' # Everything
使い方
Python API
import asyncio
from diffgrab import DiffTracker
async def main():
tracker = DiffTracker()
# Track a URL (takes initial snapshot)
await tracker.track("https://example.com", interval_hours=12)
# Check for changes
changes = await tracker.check()
for change in changes:
if change.changed:
print(change.summary)
print(change.unified_diff)
# Get diff between specific snapshots
result = await tracker.diff("https://example.com", before_id=1, after_id=2)
# Browse snapshot history
history = await tracker.history("https://example.com", count=20)
# Stop tracking
await tracker.untrack("https://example.com")
await tracker.close()
asyncio.run(main())
便利な関数
from diffgrab import track, check, diff, history, untrack
await track("https://example.com")
changes = await check()
result = await diff("https://example.com")
snaps = await history("https://example.com")
await untrack("https://example.com")
CLI
# Track a URL
diffgrab track https://example.com --interval 12
# Check all tracked URLs for changes
diffgrab check
# Check a specific URL
diffgrab check https://example.com
# Show diff between snapshots
diffgrab diff https://example.com
diffgrab diff https://example.com --before 1 --after 3
# View snapshot history
diffgrab history https://example.com --count 20
# Stop tracking
diffgrab untrack https://example.com
MCP サーバー
Claude Code の MCP 設定に追加します:
{
"mcpServers": {
"diffgrab": {
"command": "diffgrab-mcp",
"args": []
}
}
}
または uvx を使用します:
{
"mcpServers": {
"diffgrab": {
"command": "uvx",
"args": ["--from", "diffgrab[mcp]", "diffgrab-mcp"]
}
}
}
MCP ツール:
| ツール | 説明 |
|---|---|
track_url | 変更追跡する URL を登録します |
check_changes | 追跡中の URL に変更がないか確認します |
get_diff | スナップショット間の構造化差分を取得します |
get_history | スナップショットの履歴を閲覧します |
untrack_url | URL の追跡を停止します |
DiffResult
すべての差分処理は DiffResult を返します:
@dataclass
class DiffResult:
url: str # The tracked URL
changed: bool # Whether content changed
added_lines: int # Lines added
removed_lines: int # Lines removed
changed_sections: list[str] # Markdown headings with changes
unified_diff: str # Standard unified diff
summary: str # Human-readable summary
before_snapshot_id: int | None # DB ID of older snapshot
after_snapshot_id: int | None # DB ID of newer snapshot
before_timestamp: str # When older snapshot was taken
after_timestamp: str # When newer snapshot was taken
ストレージ
スナップショットは SQLite の ~/.local/share/diffgrab/diffgrab.db に保存されます(自動作成)。カスタムパスを指定する場合:
tracker = DiffTracker(db_path="/path/to/custom.db")
QuartzUnit エコシステム
| パッケージ | 役割 | PyPI |
|---|---|---|
| markgrab | HTML/YouTube/PDF/DOCX を Markdown に変換 | pip install markgrab |
| snapgrab | URL からスクリーンショットとメタデータを取得 | pip install snapgrab |
| docpick | OCR + LLM によるドキュメント抽出 | pip install docpick |
| feedkit | RSS フィードの収集 | pip install feedkit |
| diffgrab | ウェブページの変更追跡 | pip install diffgrab |
| browsegrab | LLM 向けブラウザーエージェント | 近日公開 |
使用例
- newswatch — RSS ニュース監視パイプライン(feedkit → markgrab → embgrep → diffgrab)
- watchdeck — 視覚的な差分と安全ガードを備えたウェブページ監視
ライセンス
QuartzUnit エコシステムの一部です — データ収集、抽出、検索、AI エージェントの安全性に対応する、組み合わせ可能な Python ライブラリです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。