Django Chainsaw について
Django Chainsawは、Djangoおよび関連するPythonプロジェクトのリスクを特定する、決定論的なMCPサーバー兼コマンドラインツールです。ソース構文とDjangoのアプリレジストリを解析し、アプリコードを実行せず、データを外部に送信せずにCIチェックを実行できます。
主な機能
- 01Djangoのモデル、クエリ、マイグレーションを検査
- 02テナント範囲とAPI公開のリスクを検出
- 03FastAPIとSQLAlchemyのパターンを解析
- 04問題をエンドポイントと重大度で分類
- 05SARIFとHTMLレポートを出力
- 06ベースラインとブランチ比較に対応
活用シーン
- 01デプロイ前にマイグレーションの安全性を確認
- 02テナントデータ漏えいとクエリ効率の問題を発見
- 03プルリクエストで新規の問題だけを確認
- 04CIやチームレビュー用のレポートを作成
MCP 対応
MCPクライアントに、マイグレーション、クエリ、エンドポイント、削除の影響などを検査するツールとプロンプトを提供します。アプリレジストリを使う検査にはDjangoプロジェクトのパスとsettingsモジュールが必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx django-chainsaw-mcpDJANGO_CHAINSAW_PROJECT_PATHAbsolute path to the Django project to analyse - the directory containing manage.py, or whichever directory the settings module is importable from. This server must run in an interpreter that can import that project, so install it into the project's own environment rather than an isolated one.DJANGO_CHAINSAW_SETTINGS_MODULEDotted path to the settings module, for example myproject.settings. Point it at the settings the site actually runs on: a base or partial module can import cleanly and load no models, and the server says so when that happens.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
37掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
django-chainsaw-mcp
Django プロジェクトを説明するのではなく、解析する MCP サーバーと CLI です。 ここに何があるかではなく、何が問題になるかを明らかにします。削除すると何が巻き込まれるのか、どのマイグレーションがまだ稼働中の Pod を壊すのか、どのクエリが別のテナントの行を返すのか、save() が何段階も先で何を引き起こすのかを示します。
処理にモデルは使いません。 すべての回答は AST と Django 独自のアプリレジストリから導かれるため、同じ入力には同じ出力が返され、何もマシンの外に出ません。アシスタントが質問できる MCP サーバーであり、CI が回答に基づいて判定できる CLI でもあります。
22 個のチェックがあります。アプリレジストリが必要なのは 19 個(うち 16 個は Django、さらにそのうち 3 個は DRF も必要)、Python だけでよいものが 1 個、FastAPI を読み取るものが 1 個、SQLAlchemy を読み取るものが 1 個です。 このプロジェクトが生まれた理由 →
インストール
プロジェクトをインポートできるインタープリターで実行する必要があります。 ここにあるすべての機能はアプリレジストリを読み取るため、django.setup()、設定、アプリが必要です。
/path/to/project/.venv/bin/python -m pip install django-chainsaw-mcp
通常の uvx django-chainsaw-mcp は起動後、すべてのチェックに失敗します。uvx はプロジェクトの痕跡が何もない隔離環境を用意するためです。インストールせずに実行するには、依存関係を uv に渡します。
uvx --with-requirements requirements.txt --from django-chainsaw-mcp django-chainsaw check
次の 2 つの環境変数でプロジェクトを指定します。
| 変数 | 例 |
|---|---|
DJANGO_CHAINSAW_PROJECT_PATH | /srv/app — 設定をインポートできるディレクトリ |
DJANGO_CHAINSAW_SETTINGS_MODULE | myproject.settings |
django-chainsaw project-info を実行すると、ほかの処理を始める前に設定を確認し、どちらが不足しているかを知らせます。最初から最後まで 5 分で →
mcp-name: io.github.syrian963/django-chainsaw-mcp
1 つのコマンド
django-chainsaw check --tenant-root myapp.Organisation
44 finding(s): 1 critical, 14 high, 29 medium
CRITICAL
--------
[deploy-safety] RemoveField drops 'legacy_code' while code still uses it
shop/0002_remove_product_legacy_code
During a rolling deploy the old pods keep running against the new
schema and will fail.
fix: Ship a release that stops using it, deploy that everywhere,
then ship this migration.
すべての解析結果をまとめ、重大度の高い順に表示し、終了コードは 1 つだけ返します。
プルリクエストでの利用
このようなツールが使われ続けるかどうかを左右するのは、ここです。5 年前のプロジェクトを tenancy に指定すると、候補が 200 件返ってきます。200 件もの候補を読む人はいません。誰かが continue-on-error を追加し、ツールは誰にも見られないまま動き続けることになります。
django-chainsaw tenancy --since main # only what this branch changed
django-chainsaw tenancy --baseline # everything old, ratcheted
django-chainsaw check --sarif out.json # annotate the diff, on the line
--since はマージベースを比較するため、main より遅れているブランチが、ほかの人の変更によって責められることはありません。--baseline を使うと、既存の検出結果はレポートに残しつつ、ビルドをブロックしないようにできます。新たな検出結果があればビルドは失敗し、古い問題を修正した場合はそのことが報告されるため、件数は減る一方です。検出結果のフィンガープリントは行番号ではなく、ファイルと識別情報に基づいて作られるため、インポートを追加しても、手を付けていない 20 件の検出結果が再び現れることはありません。
--sarif を指定すると、GitHub や GitLab がプルリクエストに注釈を付ける形式で出力されるため、検出結果が誰も開かないログではなく、該当行に表示されます。
MCP サーバーとして
claude mcp add django-chainsaw --scope local \
--env DJANGO_CHAINSAW_PROJECT_PATH=/srv/app \
--env DJANGO_CHAINSAW_SETTINGS_MODULE=myproject.settings \
-- /srv/app/.venv/bin/python -m django_chainsaw_mcp.server
まず project_info を実行してください。トランスポートと Django の起動の両方を確認できる、最小の呼び出しです。5 つのプロンプトが、ツールだけでは伝わらない実行順序を示します。before_deploy、why_is_this_slow、what_breaks_if_i_delete、triage、review_this_branch。
Claude Desktop、Cursor、VS Code、Windsurf、Zed、Docker →
または、1 つの HTML ファイルとして
django-chainsaw report --out findings.html --title myproject

重要なのはエンドポイント別のビューです。どのページがこれを利用し、どの呼び出し経路を通るのかが分かります。サーバーもネットワークもビルド手順も不要です。CSS、スクリプト、データがすべてファイルに含まれているため、CI の成果物やメールの添付ファイルからでも動作します。report.md
チェック項目
Django プロジェクト — これらはアプリレジストリを読み取るため、プロジェクトのパスに加えて DJANGO_CHAINSAW_SETTINGS_MODULE が必要です
| ツール | 分かること |
|---|---|
project_info | 対象のプロジェクトは読み込めますか?何かが壊れている場合は、まずこれを実行してください。 |
list_models | すべてのモデルと、フィールド、リレーションの種類、方向、on_delete。 |
delete_impact | 1 行を削除すると何が起きるか。カスケードするもの、ブロックするもの、NULL になるものを推移的に示します。 |
find_n_plus_one | テンプレート内でクエリが発生するリレーションのたどり方と、その修正方法。 |
scan_templates | ディレクトリ全体を対象に、ビューからコンテキストを解決して同じ内容を調べます。 |
migration_risk | マイグレーションを評価します。書き込みをブロックするか、テーブルを書き換えるか、実行中のコードを壊すかを示します。 |
deploy_safety | この破壊的なマイグレーションは、まだ安全にデプロイできますか? |
find_unscoped_queries | 呼び出し元が所有していない可能性のあるデータを読み取るクエリはどれですか? IDOR の典型的な形です。 |
what_happens_on | この保存処理は何を実際に引き起こしますか? シグナルの連鎖をたどります。 |
missing_indexes | コードがフィルタリングや並べ替えに使うフィールドのうち、インデックスがないもの。 |
datetime_audit | 時計が進んだときに問題を引き起こす、タイムゾーン情報のない日時やフィールドのデフォルト値。 |
serializer_exposure | DRF シリアライザーが公開する内容。次のマイグレーションで追加されるものも含みます。 |
serializer_nplusone | DRF シリアライザー内の N+1。API プロジェクトで N+1 が発生する箇所です。 |
explain_model | 1 つのモデルに関するすべての情報と、組み合わせたときにだけ見えるリスク。 |
endpoint_cost | 誰かがリクエストを送る前に、1 回のリクエストにかかるクエリ数を示します。 |
api_contract / api_contract_check | このブランチが API に加える変更と、その変更で影響を受ける対象。 |
escaping_side_effects | ロールバックする可能性があるトランザクション内で実行されるメール送信やタスク。 |
bypassed_effects | save() の連鎖が保証するすべての処理を飛ばす一括書き込み。 |
race_conditions | Python に読み込んだカウンターを変更して保存する処理。また、安全でないアップサート。 |
money_precision | 小数の金額が正確でなくなる箇所。 |
celery_arguments | ワーカーが実際に受け取る内容と、そのタスクを呼び出せるかどうか。 |
queries_in_loops | ループ内に記述されたクエリを、適用できる 3 種類の修正方法ごとに分類します。 |
defeated_prefetches | プリフェッチにコストをかけた後、その値を読み取るアクセサーが再度クエリを実行してしまう箇所。 |
request_impact | 検出項目を、それらに到達するエントリーポイントごとにまとめます。これにより、どのエンドポイントを修正すべきかが分かります。 |
choice_typos | フィールドの choices と一致しないリテラル。SQL としては有効ですが、結果は 0 行で、例外も発生しません。 |
multiplied_aggregates | 複数の値を持つ 2 つのリレーションをまたぐ結合によって、カウントや合計が重複する箇所。 |
dangling_references | 名前付き URL、テンプレート、シグナル送信元、Celery タスクのうち、解決されないもの。 |
open_endpoints | 誰でも呼び出せるエンドポイントにある機密フィールド。 |
unused_eager_loading | レスポンス内で何も読み取らない結合やプリフェッチ。 |
check | 該当するすべてのチェックを実行し、重大度順の一覧と終了コードを返します。 |
suggest_fixes | 検出項目をコードに変換し、それぞれの適用安全性ごとにまとめます。 |
すべての Python プロジェクト — Django も設定モジュールも不要です
| ツール | 分かること | | --- | --- | | `project_profile` | 何を基盤としているかを確認します。プロジェクト自身のインポートから算出します。 | | `blocking_in_async` | **すべてのリクエストでイベントループを停止させる同期呼び出しはどれですか?** | | `fastapi_exposure` | 宣言された内容を超えてシリアライズするエンドポイントを確認します。 | | `sqlalchemy_nplusone` | シリアライズ中も含め、関連を1行ずつ読み込む箇所を確認します。 | | `amplification` | **見知らぬ人がデータベースを枯渇させるために使えるエンドポイントはどれですか?** |さらに、リソース django://models があります。check はまずプロジェクトをプロファイリングし、該当するチェックを実行します。残りについては「該当しません。その理由は以下のとおりです」と示します。何も表示されなければ、すべて問題なしと誤解されてしまうためです。FastAPI のサポート機能はプロジェクトをインポートしないため、依存関係を一切インストールしていないチェックアウトでも、これらのチェックを実行できます。
37 個のツールのうち 36 個で readOnlyHint が宣言されているため、クライアントは呼び出しごとに許可を求めずに済みます。例外は update=True を指定する api_contract_check で、スナップショットを書き込み、そのことを明示します。
すべてのツール、引数、出力形式 →
このツールが教えてくれないこと
ここでは対象プロジェクトを実行したり、そのデータを読み取ったりしません。そのため安全で高速ですが、確実性は犠牲になります。各ツールは、それぞれの出力で見落とし得る点を明示します。
delete_impactはシグナルやカスタムdelete()オーバーライドを実行しません。find_n_plus_oneは候補を報告します。テンプレートとモデルのグラフを読み取りますが、ビュー内のクエリセットは読み取りません。migration_riskは行数、PostgreSQL のバージョン、デプロイ戦略を把握しません。deploy_safetyはgetattr(obj, name)、実行時の SQL、別のリポジトリを確認できません。CLEARは「ここでは何も見つかりませんでした」という意味です。
不完全な回答より、自信に満ちた誤った回答のほうが危険です。 この種のツールでの失敗は、クラッシュではありません。誰かを誤った方向へ導く、もっともらしい一文です。limitations.md
コードに対して行うこと
対象プロジェクトをインポートします。 django.setup() は設定と INSTALLED_APPS に登録されたすべてのアプリをインポートします。また、各チェックはシリアライザー、ビュー、URL を宣言するモジュールもインポートするため、それらがインポート時に実行する処理も実行されます。実行しないコードに対して、このツールを使わないでください。
アプリケーションは実行しません。ビュー、タスク、管理コマンドは実行されません。
チェックのうち 1 つはデータベースを読み取ります(読み取り専用)。MigrationLoader が django_migrations を読み取りますが、書き込みは一切行いません。
ファイルを書き込むのは、指示があった場合のみです。fix --write は機械的に適用できる種類の修正のみを適用します。また、ベースライン、コントラクトのスナップショット、--sarif の出力は、指定した場所に書き込みます。マシンの外にデータが送信されることはありません。ネットワーク呼び出し、テレメトリー、アップロードはありません。
ドキュメント
docs/ が目次です。
why.md | このツールが存在する理由、詳しく読む価値のある 3 つのチェック、新しいチェックに求められる基準 |
quickstart.md | クローンから最初の検出結果まで、5 分で完了 |
usage.md | 実際のプロジェクトに対するインストール、Docker、トラブルシューティング |
clients.md | Claude Code、Cursor、VS Code、Windsurf、Zed |
cli.md | コマンド、終了コード、CI |
tools.md | すべてのツール、引数、出力形式 |
tested-against.md | 18 個の公開プロジェクト、このツールで見つかった問題、そして一度も発火しなかったチェック |
limitations.md | 分析で確認できないこと |
baseline.md | レガシーコードベースでも使い続けられるようにする、段階的な基準の引き上げ |
fixes.md | 実際のコードとしての修正案と、適用可能な修正 |
architecture.md | 構成と、ブートストラップが設計を左右する理由 |
performance.md | 大規模なプロジェクトで時間がかかる箇所 |
コントリビューション
CONTRIBUTING.md | ワークフロー、プロジェクトのスタイル、テストスイートの実行方法 |
CHANGELOG.md | すべてのリリースと、変更の背景 |
SECURITY.md | 対象として指定したコードに対して、このツールが行うこと |
CODE_OF_CONDUCT.md | 誠実に接し、親切に対応すること |
新しいチェックを提案する際は、4つの問いに答えてください。イシューテンプレートでは、次の点を直接尋ねています。欠陥がコード上でどのように見えるか、本番環境でどのような問題が起きるか、すでにそれを検出できるものは何か、そして検出してはならないものは何か。このリポジトリでは、実際の問題と正常なコードを見分けられないことが測定で判明したため、完成済みの機能を2つ削除しました。
MIT。django.setup()は取り消せないため、1つのプロセスは最初に読み込んだプロジェクトに固定されます。2つ目のプロジェクトには、別のインスタンスを実行してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。