mcpField
C
claude-webcache

claude-webcache

ローカル
github.comブラウザ自動化18 週間前に更新

claude-webcache について

claude-webcacheは、WebFetchとWebSearchの結果をローカルのSQLiteデータベースに保存し、Claude Codeのセッション間で再利用します。ページや検索結果を繰り返し参照するワークフロー向けに、自動キャッシュフック、名前空間、管理ツールを備えています。

主な機能

  1. 01セッション間で保持するウェブキャッシュ
  2. 02WebFetch結果の自動読み取りと保存
  3. 03WebSearch結果のキャッシュ
  4. 04プロジェクト別の名前空間分離
  5. 05キャッシュの確認、事前取得、削除

活用シーン

  1. 01Claude Codeのセッション間でページ内容を再利用
  2. 02同じURLとプロンプトで繰り返し検索
  3. 03プロジェクト別にキャッシュ項目を確認・管理

MCP 対応

cached_fetch、cached_search、結果の保存、統計と項目の確認、無効化、キャッシュ削除のMCPツールを提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"theyahia-claude-webcache": {
"command": "npx",
"args": [
"-y",
"@theyahia/claude-webcache"
]
}
}
}
起動コマンドnpx -y @theyahia/claude-webcache

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@theyahia/claude-webcache0.1.5

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

claude-webcache

npm npm downloads license tests

Claude Code 向けの、セッションをまたいで永続化される WebFetch キャッシュです。キャッシュからの読み込みは約 0.07ms で、再取得より桁違いに高速です。

Claude Code 組み込みのキャッシュは、1 つのセッション内で 15 分間有効です。新しいセッションを開始するたび、最初から再取得します。claude-webcache はローカルの SQLite データベースに結果をセッションをまたいで保存するため、キャッシュヒットは瞬時で、ネットワークコストはかかりません。

Session 1  →  WebFetch("docs.example.com")  →  fetched, auto-cached ✓
Session 2  →  cached_fetch("docs.example.com")  →  instant hit, no network call
Session 7  →  cached_fetch("docs.example.com")  →  still instant, unlimited TTL

v0.1.5 以降: PostToolUse フックにより、すべての WebFetch が自動的に保存されます。設定は不要です。

CACHE_MISS フロー:最初のセッションでの WebFetch + cache_store CACHE_HIT フロー:2 つ目のセッションでは瞬時にヒットし、WebFetch は実行されません

インストール

claude plugin marketplace add theYahia/claude-webcache && claude plugin install claude-webcache@theyahia

Claude Code CLI・デスクトップ(Mac/Windows)・VS Code 拡張機能・JetBrains プラグインで動作します。どこでも同じコマンドを使えます。

これで完了です。以後、すべての WebFetch が自動的にキャッシュされます。

必要に応じて、使用パターンを ~/.claude/CLAUDE.md に追加すると、取得する前にキャッシュも確認できます(同じ URL を再利用する場合、WebFetch の呼び出し自体を省略できます)。

プラグイン TUI が動作しませんか? /plugin install がサードパーティーのソースを「source type not supported」として拒否する、Claude Code の未解決のバグ(#41653)があります。上記の CLI コマンドを使ってください。TUI を介さず、問題なく動作します。

代替手段(マーケットプレイスを使わない場合):

git clone https://github.com/theYahia/claude-webcache && claude --plugin-dir ./claude-webcache/plugin
オプション 2 — npm グローバルインストール
npm i -g @theyahia/claude-webcache

Node.js 22.5 以降が必要です(組み込みの node:sqlite を使用するため、ネイティブ依存関係もインストール手順もありません)。

その後、~/.claude/settings.json に登録します(パスは npm root -g の出力に置き換えてください)。

{
  "mcpServers": {
    "claude-webcache": {
      "command": "node",
      "args": ["/path/from/npm-root-g/claude-webcache/scripts/mcp-server.cjs"]
    }
  },
  "hooks": {
    "SessionStart": [
      {
        "matcher": "startup|clear|compact",
        "hooks": [
          { "type": "command", "command": "node /path/from/npm-root-g/claude-webcache/scripts/hook-stats.cjs" }
        ]
      }
    ]
  }
}
オプション 3 — クローン(コントリビューター向け)

CONTRIBUTING.md を参照してください。

使用パターン(任意 — 取得前にキャッシュを確認する場合)

v0.1.5 以降、すべての WebFetch が自動的にキャッシュされます。 以下のパターンは任意です。~/.claude/CLAUDE.md に追加すると、WebFetch を実行する前にキャッシュも確認できます。同じ URL を再利用する場合、WebFetch の呼び出し自体を省略できます。

自動読み込み(v0.5 以降):操作は不要です。 PreToolUse フックが、すべての WebFetch/WebSearch の前にキャッシュを確認します。ヒットした場合はキャッシュ済みのコピーを返し、ネットワークアクセスを省略します。ミスした場合は通常どおり呼び出しを実行し、PostToolUse フックが結果を保存します。今後どのセッションでも同じ URL と同じプロンプト(または同じ検索クエリ)を使うと、瞬時にヒットし、ネットワークコストはかかりません。

必要に応じて、手動での検索も引き続き利用できます。cached_fetch(url, prompt)(または cached_search(query))を呼び出すと、キャッシュ済みのテキストが返されます。存在しない場合は [CACHE_MISS] … が返されます。WEBCACHE_AUTOREAD=0 で自動読み込みを無効にできます。

⚠ セキュリティ — 認証済み URL

キャッシュは、レスポンスとともに URL を ~/.webcache/cache.db に保存します。デフォルトでは、claude-webcache は書き込み前に、保存する URL から明らかな認証情報を取り除きます(user:pass@host や、token、api_key、apikey、access_token、auth、secret、password、key、signature などの名前を持つクエリパラメーター)。

これは表示レベルでのマスキングであり、キー単位のものではありません。 キャッシュキーは元の URL のハッシュ値を使うため、同じ認証済み URL を再取得するとキャッシュにヒットします。より厳格なトレードオフが必要な場合は、次の設定を使用してください。

export WEBCACHE_STRICT_REDACT=1

WEBCACHE_STRICT_REDACT=1 を設定すると、キャッシュキーもマスキング済み URL から計算されます。そのため、?token=A と ?token=B だけが異なるエンドポイントは、1 つのスロットに衝突します。パススルー認証(コンテンツが同一)には安全ですが、ユーザーごとに異なるエンドポイントでは安全ではありません(異なるユーザー同士でキャッシュデータが共有されます)。

結論: URL に埋め込んだトークンよりも、ヘッダーベースの認証(Authorization: ヘッダー)を優先してください。~/.webcache/cache.db を Git にコミットしないでください。

名前空間

1台のマシンを複数のプロジェクトで共有していますか?プロジェクトごとにキャッシュを分離できます。

WEBCACHE_NAMESPACE=gosdelo  claude    # cache writes/reads scoped to ns "gosdelo"
WEBCACHE_NAMESPACE=qsearch  claude    # separate ns, no cross-contamination

デフォルトの名前空間は空文字列 "" です(v0.3 の動作と同じく、キャッシュを共有します)。CLI で名前空間ごとの状態を確認・管理できます:claude-webcache namespaces、claude-webcache --namespace gosdelo stats。

ツール(MCP)

ツール引数戻り値
cached_fetchurl、promptキャッシュされたテキスト、または [CACHE_MISS] <url>
cached_searchqueryキャッシュされた WebSearch の結果、または [CACHE_MISS] <query>(websearch 名前空間、短い TTL)
cache_storeurl、prompt、outputstored
cache_statsglobal?{ namespace, total, hits, misses, hit_rate, last, db_size_bytes, evicted, oversize_skipped, last_hook_error_at, top_urls, ... }
cache_listlimit?、offset?、global?最近の URL(新しいものから順)
cache_invalidateurl{ deleted: N } — 現在の名前空間で、その URL のすべてのエントリーを削除します
cache_clearolder_than_days?、confirm?{ deleted: N } — 経過日数による部分削除、または confirm:"YES" による全削除
cache_warmentries: [{url,prompt}] または urls[]+prompt{ hits, misses, invalid } — 1回の呼び出しで一括事前チェックします
cache_refreshurl、prompt[CACHE_MISS] <url> — 無効化し、再取得を促します

CLI

npm パッケージには、臨時の確認に使える claude-webcache バイナリと、ローカル Web ダッシュボードが含まれています。

claude-webcache stats                            # JSON stats
claude-webcache stats --by-domain                # per-domain breakdown
claude-webcache list 20                          # 20 most-recent URLs
claude-webcache list 50 --offset 100             # pagination
claude-webcache invalidate https://news.com/123  # drop one URL
claude-webcache refresh https://news.com/123 --prompt "extract title"   # invalidate one (url,prompt) pair
claude-webcache warm urls.txt --prompt "extract" # bulk pre-flight check
claude-webcache clear --older-than-days 30       # partial wipe
claude-webcache clear --confirm YES              # full wipe (requires explicit confirm)
claude-webcache clear-logs                       # truncate ~/.webcache/hook.log
claude-webcache namespaces                       # list all namespaces present
claude-webcache export --out cache.json --all    # export metadata
claude-webcache dashboard                        # open http://localhost:37778
claude-webcache --namespace gosdelo stats        # scope command to namespace

ダッシュボードでは、ヒット数の多い URL、ドメイン(平均ヒット数/最終取得日時/エントリー数を含む)、検索可能でページ分割された全件リストを表示します。リストにはワンクリックで実行できる無効化ボタンと更新ボタンがあります。標準ライブラリのみで動作し、追加の依存関係は不要です。

設定(環境変数)

変数デフォルト効果
WEBCACHE_TTL_DAYS無制限グローバル TTL(日数)。0 または未設定の場合は無制限です。
WEBCACHE_MAX_SIZE_MB無制限このサイズを超えると、次回の書き込み時に、last_hit_at が古いエントリーの約 20% を LRU 方式で削除します(100 回の書き込みごとにデバウンス)。
WEBCACHE_DOMAIN_TTLなしドメインごとの TTL を指定する JSON:{"news.com":1,"reuters.com":1,"arxiv.org":0}。日数を指定します。0 は無制限です。サブドメインにもサフィックス一致で適用されます。一致した場合はグローバル TTL より優先されます。
WEBCACHE_NAMESPACE""(共有)プロジェクトごとにキャッシュを分離します。異なる名前空間のエントリーは互いに参照できません。
WEBCACHE_MAX_OUTPUT_MB10N MB を超える WebFetch レスポンスを拒否します。統計には oversize_skipped カウンターと last_oversize_url が記録されます。
WEBCACHE_COMPRESSオフ1 にすると、4 KB 以上のレスポンスを gzip で圧縮します。TEXT 列には base64 として保存されます。既存の非圧縮行も問題なく読み込めます(BC)。
WEBCACHE_STRICT_REDACTオフ1 にすると、キャッシュキーに秘匿化した URL を使用します。トークンの値に関係なく、エンドポイントごとに衝突します。上記のセキュリティを参照してください。
WEBCACHE_QUIETオフ1 にすると、フックの stderr 出力を抑制します(~/.webcache/hook.log へのファイルログは引き続き書き込まれます)。
WEBCACHE_DEBUGオフ1 にすると、自動キャッシュフックの詳細なトレースを有効にします。
WEBCACHE_SEARCH_TTL_HOURS6キャッシュされた WebSearch 結果(websearch 名前空間)の TTL です。検索順位は変動するため、デフォルトでは短く設定されています。0 にすると期限切れになりません。
WEBCACHE_AUTOREADオン0 にすると、PreToolUse の自動読み込みフックを無効にします(キャッシュへの書き込みは PostToolUse 経由で引き続き行われます。cached_fetch/cached_search で手動で読み込みます)。

SessionStart フック

新しいセッションの開始時に、キャッシュがあることを Claude に知らせる一行が挿入されます。

webcache [ns=gosdelo] 142 pages cached, 87% hit rate, last fetch 3h ago

キャッシュが空の場合は出力されません。デフォルトの名前空間を使用している場合、[ns=...] は省略されます。

ストレージ

~/.webcache/cache.db にある SQLite(WAL モード、synchronous=NORMAL、busy_timeout=5000)。 キャッシュキー = SHA256(namespace + "|" + canonical(url) + "|" + prompt)。デフォルトの TTL:無制限(N 日後に期限切れにするには WEBCACHE_TTL_DAYS=N を設定します)。

URL の正規化(v0.4 以降):ホスト名を小文字に変換し、デフォルトポート(:80/:443)とフラグメントを取り除き、クエリパラメーターをアルファベット順に並べ替えます。そのため、https://EXAMPLE.com/p?b=2&a=1#frag と https://example.com/p?a=1&b=2 は同じキャッシュキーになります。URL の書式の違いによるキャッシュミスは発生しません。

フィールド型
keyTEXT PRIMARY KEY
urlTEXT(秘匿化済み)
prompt_hashTEXT
outputTEXT(compressed=1 の場合は gzip+base64)
cached_atINTEGER(エポックからのミリ秒)
hit_countINTEGER
last_hit_atINTEGER
namespaceTEXT(デフォルトは "")
compressedINTEGER(0/1)

WAL と 5 秒の busy_timeout により同時実行に安全です。複数の Claude Code セッションから同時に読み書きしても、SQLITE_BUSY エラーは発生しません。

制限事項

  • キャッシュキーにはプロンプトが含まれます。ヒット率を最大化するには、プロンプトを統一してください。
  • 出力は WebFetch が返す内容(すでに要約済み)です。再処理は行いません。
  • セマンティック検索には対応していません。完全一致する (namespace, canonical_url, prompt) のみが対象です。

ベンチマーク

データが格納された DB(N=10000 件、各出力 1KB)での単一プロセスのレイテンシーを、npm run bench で測定:

操作p50p95p99ops/sec
write0.09ms0.15ms2.66ms5,800
read_hit0.07ms0.12ms0.23ms7,600
read_miss0.04ms0.07ms0.13ms17,600
list_500.11ms0.16ms0.53ms7,400

ストレージのオーバーヘッド:ペイロードが 1 KB の場合、エントリーごとに約 2 KB(キー + インデックス + WAL + 新しい v0.4 の列)。テキスト主体のレスポンスで WEBCACHE_COMPRESS=1 を設定すると、3~7 倍の削減が見込めます。

ネットワーク経由の WebFetch には通常 1~5 秒かかります。キャッシュヒットは約 15,000~70,000 倍高速です。お使いのハードウェアで再現するには、npm run bench を実行してください。測定方法と、実行ごとに保存される結果のメタデータ(CPU、RAM、OS、コミット)については、bench/README.md を参照してください。

関連項目

  • claude-mem — セッションをまたいで保持される永続メモリ(claude-webcache を補完します。メモリとウェブキャッシュの違いです)
  • WWmcp — 非西洋圏の API 向け MCP サーバー 46 件のカタログ

ライセンス

MIT — LICENSE を参照してください。


WWmcp の一部 · Telegram: @vhodvai

コメント

MCP は初めてですか?

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

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