mcpField
L
leakguard-mcp

leakguard-mcp

ローカル
github.com/doazvjettu開発ツール020 週間前に更新

leakguard-mcp について

leakguard-mcpは、開発者やコーディングエージェント向けに、Pythonの時系列MLコードを調べるローカル優先の静的解析ツールです。バックテスト前に先読みバイアスやデータ漏洩の一般的なパターンを検出し、修正例を示します。解析はヒューリスティックで、コードは実行しません。

主な機能

  1. 01未来シフトと中央寄せウィンドウの検出
  2. 02正規化と分割時の漏洩の検出
  3. 03バックフィルと前方向as-of結合の確認
  4. 04重大度と修正例の提示
  5. 05コード、ファイル、globパスのスキャン

活用シーン

  1. 01生成された取引戦略のバックテスト前確認
  2. 02予測特徴量への未来データ混入の確認
  3. 03コミットフックやCIでのスキャン

MCP 対応

stdioのMCPサーバーとして、コード文字列、ファイル、パスの解析ツールとルール確認機能を提供します。MCPクライアントはエージェントのワークフローで検出結果と修正例を利用できます。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"doazvjettu-leakguard": {
"command": "uvx",
"args": [
"leakguard-mcp"
]
}
}
}
起動コマンドuvx leakguard-mcp

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

パッケージ
pypileakguard-mcp0.1.1

ツール

5

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
codestringはい
filenameanyいいえ

詳細

leakguard-mcp

PyPI Python License: MIT release MCP registry glama

バックテストのための警告装置です。 ローカルファーストの MCP サーバーで、エージェントが生成した Python コードを静的解析し、バックテスト実行前に先読みバイアスとデータリークを検出します。

時系列 ML コードなら何にでも使えます。クオンツ取引(暗号資産、株式、外国為替、先物)、 需要予測、エネルギー、天気、IoT センサーなど、誤った .shift() や グローバルな正規化によって結果がひそかに汚染されるあらゆるケースに対応します。

  • ソースコードのみを解析(libcst)— コードがマシンの外に出ることはありません。API 呼び出しもありません。
  • ヒューリスティックであり、証明ではありません。航空機の警告装置のように、重大度を分類します(🔴 エラー/🟡 警告)。
  • フレームワークに依存しません。pandas/numpy/polars など、あらゆるスタックに対応します。
  • MCP ネイティブ(stdio)です。Claude Code、Cursor、および MCP 対応のあらゆるエージェント内で直接動作します。
  • 10 個のルールすべてを無料で利用できます — ライセンス不要、プラン分けなし、外部への通信もありません。

ストラテジーファイル内の3つの先読みリークを検出するleakguard


これが必要な理由

AI エージェント(Claude Code、Cursor)は、人間がレビューするよりも速く特徴量エンジニアリングや ストラテジーのコードを作成します。しかし、先読みバイアスを大規模に発生させます。 バックテストでは完璧に見える一方、本番取引や本番環境では致命的な失敗につながる、 時間境界の微妙な誤りです。

# Agent writes this — looks fine, is catastrophically wrong
df['momentum'] = df['close'].shift(-5)   # uses FUTURE prices as a feature
df['vol_norm'] = (df['close'] - df['close'].mean()) / df['close'].std()  # leaks future mean

leakguard は、バックテストの実行前に、同じエージェントのループ内でこれらを検出します。

LG001 🔴 line 2: Future shift used as feature — shift(-5) references 5 bars ahead.
  Fix: df['momentum'] = df['close'].shift(5)   (lag, not lead)

LG003 🔴 line 3: Global-fit normalization — mean/std computed over the full series
  before any train/test split, leaking future statistics into the past.
  Fix: df['vol_norm'] = (df['close'] - df['close'].expanding().mean()) / df['close'].expanding().std()

エージェントは検出内容と修正スニペットを読み、1回のターンで自ら修正します。人間によるレビューは不要です。


インストール

必要要件
  • Python 3.11+
  • uv(推奨)または pip
PyPI から
pip install leakguard-mcp
ソースから
git clone https://github.com/doazvjettu/leakguard-mcp
cd leakguard-mcp
uv sync

Claude Code のセットアップ

MCP 設定(~/.claude/claude_desktop_config.json またはプロジェクト内の .claude/settings.json)に追加します。

{
  "mcpServers": {
    "leakguard": {
      "command": "python",
      "args": ["-m", "leakguard.server"]
    }
  }
}

uv でインストールした場合は、次のようにします。

{
  "mcpServers": {
    "leakguard": {
      "command": "uv",
      "args": ["run", "python", "-m", "leakguard.server"]
    }
  }
}

Claude Code を再起動します。これで、leakguard のツールをエージェントが利用できるようになります。

Cursor のセットアップ

Cursor の MCP 設定ファイルで、mcpServers の下に同じブロックを追加します。


MCP ツール

ツール説明
lint_code(code)コード文字列を解析し、検出結果を返します
lint_file(path)ディスク上のファイルを解析します
lint_paths(glob)glob に一致するすべてのファイルを解析します
list_rules()重大度付きですべてのルールを一覧表示します
explain_rule(rule_id)ルールの詳しい根拠と修正パターンを表示します

CLI

同じスキャナーを CLI からも利用できます。コミット前フックや CI ステップに便利です(リークが見つかると ゼロ以外の終了コードを返します)。

uv run leakguard path/to/strategy.py
# or, installed:  leakguard path/to/strategy.py

検出結果ごとに、重大度、行番号/列番号、具体的な修正スニペットを表示します。上のデモと 同じ出力です。


ルール

10 個のルールがすべて有効で、重要度による段階分けはありません。

ID重要度パターン
LG001🔴特徴量としての未来シフト:shift(-n) / diff(-n) / pct_change(-n)
LG002🔴中心化ウィンドウ:rolling(center=True)
LG003🔴全体データへのスケーリングの適合:StandardScaler().fit(full_df) / 分割前に手作業で平均と標準偏差を算出
LG004🔴シャッフルされた時系列分割:train_test_split のデフォルト、KFold、cross_val_score(cv=n)
LG005🔴ラベルリーク:未来由来のターゲット列を特徴量で再利用
LG006🟡全期間の集計値を特徴量として使用:全系列を対象にした .max() / .mean()
LG007🔴バックフィルによる補完:bfill() / fillna(method='bfill')
LG008🔴未来方向の asof 結合:merge_asof(direction='forward'/'nearest')
LG009🟡バーのタイムスタンプにおけるリサンプルの label/closed の不一致
LG010🟡訓練/テスト境界をまたぐ groupby().transform()/agg()

各検出項目には、呼び出し元のエージェントがすぐに自己修正できるよう、具体的な修正コード例が含まれています。


ベンチマーク

ラベル付きコーパス 2 件、合計 49 個のスニペットで測定しています。 uv run python -m benchmark.run で再現できます。

誠実性に関する注記: 取引コーパスはこのツールの作者が作成したものです。その数値は独立した検証結果ではなく、回帰テスト用の基準値として扱ってください。汎用 ML コーパスは、分野的に一歩距離があります(広く報告されているリークのアンチパターンを作者が再現したものであり、公開データセットをダウンロードしたものではありません)。このコーパスには、スキャナーが見逃すと分かっている敵対的なスニペットも意図的に含め、それらもスキャナーの誤検知・見逃しとして集計しています。

取引コーパス — 39 個のスニペット(リークあり 23 個、クリーンなコードと難しい負例 16 個):

ルール適合率再現率TPFPFN
LG00175%100%620
LG002100%100%500
LG00375%100%310
LG004100%100%400
LG005100%100%500
LG006100%100%500
LG007100%100%500
LG008100%100%200
LG00975%100%310
LG010100%100%200
全体91%100%4040

汎用 ML コーパス — 10 個のスニペット(LG003/LG004/LG010): 適合率 88%、再現率 100%(TP 7 / FP 1 / FN 0)。

合計:適合率 90.4%、再現率 100%(TP 47 / FP 5 / FN 0)。

再現率はこのコーパス上で 100% です。これまでに判明した敵対的な見逃しはすべて修正済みです(定数伝播、手作業の正規化、cv=<int>、drop に基づく選択)。コーパスにまだ含まれていないリークの形は引き続き見逃されます。下記の「既知の制限」をご覧ください。

既知の偽陽性(クリーンなコードが検出されるケース)
  • LG001: 負のシフトで作成された将来リターンのラベルを y としてのみ使用する場合 — 純粋な AST では、ターゲット列と特徴量を区別できません。
  • LG003: 分割の呼び出し位置より上で定義されたヘルパー内で適合する場合 — 行順に基づくヒューリスティックが、定義順と実行順を混同します。
  • LG004: 時系列ではないデータに対するシャッフル分割 — 日時インデックスの推定にはまだ対応していません。
  • LG009: 特徴量ではなくレポートやプロットのためのリサンプリング — 静的解析では意図を判別できません。
既知の偽陰性(まだ対応していないリークの形)
  • LG004: cv を省略した cross_val_score(...)(デフォルトで KFold が使われます)。
  • LG005: df.loc[:, 'col'] = ... または df.assign(col=...) を介した汚染の伝播。
  • 全ルール: 関数呼び出し、辞書、または定数でない変数を介して値が渡される場合 — 関数をまたぐデータフローには対応していません。

これらのセットは tests/test_benchmark.py で固定されています。新たな見逃しまたはサイレント修正があると、ドキュメントとコーパスを更新して整合させるまでテストスイートは失敗します。


開発

uv sync --extra dev
uv run pytest                              # 96 tests
uv run python -m leakguard.server          # stdio MCP server
uv run leakguard demo/strategy_leaky.py    # CLI on the demo file
uv run python -m benchmark.run             # precision/recall tables + FP/FN lists

スキャナーのコアは leakguard/core/ にあり(純粋なコードで、MCP のインポートはありません)、server.py と cli.py は薄いラッパーです。各ルールには tests/fixtures/ に対応するフィクスチャペアがあります。


制限事項(v1)

  • ヒューリスティックな静的解析です。一般的なパターンの約90%を検出しますが、100%ではありません。
  • 単一ファイルのみです。モジュール間の汚染追跡には対応していません。
  • Python のみです(pandas/numpy/polars)。
  • ランタイム実行は行いません。実行時にのみ発生するパターンは検出できません。

貢献を歓迎します。新しいルールよりも、コーパスの新しいスニペット(特に実際に遭遇したバグ)のほうが、ベンチマークの強化につながります。

コメント

MCP は初めてですか?

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

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