Django Admin MCP について
django-admin-mcp は、ModelAdmin に mixin を一つ追加するだけで MCP クライアントから Django 管理画面のモデルを扱えるようにするアプリです。Django の権限、バリデーション、変更履歴をそのまま使うため、既存のアクセス制御を保ったままエージェントにデータを扱わせたい Django プロジェクト向けです。
主な機能
- 01既存の ModelAdmin から CRUD ツールを自動生成
- 02Django の権限チェックと full_clean 検証を利用
- 03登録済みの管理アクションをツールとして呼び出し
- 04書き込みを LogEntry の変更履歴に記録
- 05mcp_fields で機密フィールドを非公開に設定
- 06トークンは紐づくユーザーの権限範囲に限定
活用シーン
- 01エージェントから Django 管理画面のレコードを参照・更新
- 02公開や CSV エクスポートなど既存の一括アクションを実行
- 03エージェントによるデータ変更を監査可能な形で提供
MCP 対応
本パッケージは HTTP 経由で MCP エンドポイントを提供し、モデルの CRUD、管理アクション、関連参照、履歴のツールと、models:// および data:// の読み取り専用リソースを公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
django-admin-mcp
ModelAdmin にミックスインを追加すると、MCP クライアントは Django の既存の権限の範囲内で、CRUD、管理アクション、リレーションシップのたどりを利用できます。依存関係は Django と Pydantic のみです。
1つのミックスイン、管理画面を通るリクエストの経路、トークン、エージェントとの会話、そして始め方。50秒 · 1080p · 60 fps · オリジナルサウンドトラック。動画を見る。
エージェントにデータベースアクセスを与えるだけではだめなのはなぜですか?
データベース接続を与えると、エージェントはテーブルに直接アクセスできます。Django admin には、誰が何を操作できるか、レコードをどのように検証するか、どの一括操作が許可されているかが、すでにプロジェクト内で定義されています。このパッケージは、そのレイヤーを迂回させず、エージェントをその内側に配置します。
- 権限 — すべての呼び出しは
ModelAdmin.has_*_permission()を通過します。トークンで実行できるのは、紐付けられたユーザーが実行できる操作だけです。アクセス権は付与されるまでありません。 - 検証 — 書き込み時には
full_clean()と、独自のsave_model()/save_related()フックが実行されるため、エージェントが管理フォームで拒否されるレコードを保存することはできません。 - 監査履歴 — 作成、更新、削除、アクションはすべて、トークンのユーザーに紐付けて Django の
LogEntryに記録されます。エージェントが何を変更したか確認でき、エージェントも履歴を読み取れます。 - 管理アクション — 「公開」「返金」「CSV エクスポート」など、登録済みのアクションが2段階の確認フローも含めてツールになります。エージェントは SQL を独自に考案するのではなく、設計済みの操作を使用します。
- 公開範囲の制限 —
mcp_fields/mcp_exclude_fieldsを使って、パスワードハッシュや秘密情報をエージェントから見えないようにできます。get_queryset()による行の絞り込みも引き続き適用されます。
比較
汎用の Django MCP サーバーや独自に作成した FastMCP ラッパーでは、ツール、スキーマ、権限チェックを関数ごとに自分で定義する必要があります。このパッケージは、すでに管理している ModelAdmin クラスを読み取ってツールを生成するため、フィールドの選択、クエリーセット、検証、アクション、権限を1か所に集約できます。エージェントには、管理画面に加えたすべての変更が反映されます。また、MCP SDK や追加の HTTP スタックを必要としない、通常の Django アプリとして提供されます。
インストール
pip install django-admin-mcp
# settings.py
INSTALLED_APPS = [
'django_admin_mcp',
# ...
]
# urls.py
urlpatterns = [
path('mcp/', include('django_admin_mcp.urls')),
# ...
]
python manage.py migrate django_admin_mcp
クイックスタート
1. モデルを公開します。 mcp_expose = True を設定すると、そのモデル用のツールが生成されます。ミックスインを持つだけでこのフラグがないモデルは、find_models からのみ検出できます。
from django.contrib import admin
from django_admin_mcp import MCPAdminMixin
from .models import Article, Author
@admin.register(Article)
class ArticleAdmin(MCPAdminMixin, admin.ModelAdmin):
mcp_expose = True # list_article, get_article, create_article, ...
mcp_exclude_fields = ['internal_notes']
list_display = ['title', 'author', 'published']
@admin.register(Author)
class AuthorAdmin(MCPAdminMixin, admin.ModelAdmin):
pass # discoverable, no direct tools
2. トークンを作成します 管理画面の /admin/django_admin_mcp/mcptoken/ で行います。エージェントが必要とする権限とグループを正確に付与してください。紐付けられたユーザーがトークンで実行できる操作の上限を定め、その変更が記録される際の識別情報となります。
3. MCP クライアントを接続します たとえば Claude Code の .mcp.json では次のように記述します。
{
"mcpServers": {
"django-admin": {
"type": "http",
"url": "http://localhost:8000/mcp/",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}
4. エージェントに依頼します。
User: Show me the latest 10 articles
Agent: [calls list_article with limit=10]
User: Mark articles 1, 2 and 3 as published
Agent: [calls action_article with action="mark_as_published", ids=[1, 2, 3]]
User: What changed on article 42?
Agent: [calls history_article with id=42]
ツール
公開された各モデル(ここでは Article)に対して、サーバーは次のものを生成します。
| ツール | 動作 |
|---|---|
list_article, get_article | ページネーションとフィルタリングを伴う読み取り(view 権限が必要) |
create_article, update_article, delete_article | 単一レコードの書き込み(add / change / delete 権限が必要) |
bulk_article | 複数レコードの一括作成、更新、削除 |
actions_article, action_article | 登録済みの管理アクションの一覧表示と実行(ファイルを返すエクスポートを含む) |
describe_article | フィールド定義、型、制約 |
related_article | 外部キーと逆リレーションの追跡 |
history_article | Django 管理画面の変更履歴 |
autocomplete_article | 外部キーフィールドの検索候補 |
さらに、公開されているすべてのものを検出する find_models、一般的なワークフロー向けの MCP プロンプト、models:// と data:// URI の読み取り専用リソースがあります。エンドポイントは HTTP 上の JSON-RPC 2.0 で通信し、ヘルスチェック用に GET /mcp/health/ を備えています。詳細なリファレンスはドキュメントにあります。
セキュリティの概要
- トークンは
mcp_<key>.<secret>の形式です。保存されるのはシークレットのソルト付きハッシュのみです。 - 各トークンは独自の権限とグループを持ち、そのユーザーの権限と交差したものが適用されます。ユーザーを無効化すると、そのトークンも無効になります。
- 有効期限は設定可能です。トークンを取り消すには、管理画面で無効化または削除します。
- 機密値はログメッセージから伏せられ、大きなアクションのダウンロードは
MCP_ACTION_MAX_FILE_BYTES(デフォルト 5 MiB)で上限が設けられます。
要件
Python 3.10 から 3.14、Django 3.2 から 6.0、Pydantic 2。この範囲のすべての Django リリースに対してテスト済みです。
プロジェクトを支援する
これが時間の節約になったなら、GitHub でのスターが他の人の発見につながります。Issue と PR を歓迎します。コントリビューションガイドを参照してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
