django-admin-fastmcp
django-admin-fastmcp
Django の管理サイトを MCP サーバーとして公開する再利用可能な Django アプリで、FastMCP 上に構築されています。
すべてのツール呼び出しは、ベアラートークンを所有するスタッフユーザーとして実行されます。すべてのツール呼び出しは、最初に ModelAdmin に権限を問い合わせます。スーパーユーザーは管理サイトでスーパーユーザーができることをすべて実行できます。スタッフユーザーは、そのスタッフユーザーが管理サイトでできることだけを実行でき、それ以上はできません。
SPEC.md が完全な仕様です。
仕組み
このパッケージを定義する3つのルール:
並列の権限システムは持たない。 認可は
ModelAdminのメソッドに委譲します:has_view_permission、has_add_permission、has_change_permission、has_delete_permission、get_queryset、get_readonly_fields、get_actions。行を隠すget_querysetのオーバーライドは、MCP からも行を隠します。並列のデータ面は持たない。 書き込みは管理サイト自身の
ModelFormとsave_modelを経由し、その後LogEntryを記録します。管理サイトの履歴ページは真実のままです。フェイルクローズ。 未解決のルックアップ、欠落した
ModelAdmin、不明なアクション、不明なフィールド、不明なツールは、すべて呼び出しを拒否します。
インストール
uv add django-admin-fastmcpアプリを設定に追加します:
INSTALLED_APPS = [
...,
"django.contrib.admin",
"django_admin_fastmcp",
]
ADMIN_FASTMCP = {
"SERVER_NAME": "acme-admin",
"EXCLUDE_MODELS": ("auth.Permission", "auth.Group"),
"WRITABLE_MODELS": (), # empty means no writes at all
}OAuth エンドポイントを管理サイトと同じサイトにマウントします:
# urls.py
urlpatterns = [
# RFC 8414 fixes this one at the site root.
path("", include("django_admin_fastmcp.well_known_urls")),
# This prefix is yours to choose. Match it to the path in MCP_URL.
path("admin/mcp/", include("django_admin_fastmcp.urls")),
path("admin/", admin.site.urls),
]このパッケージはプレフィックスをハードコードしません。メタデータドキュメントが宣伝するすべての URL は reverse() から取得されるため、エンドポイントを /backoffice/oauth/ にマウントするプロジェクトは、そのパスがディスカバリに現れ、クライアントはそれに従います。2つのルールがあります: well-known ドキュメントはルートに置く必要があります。クライアントがその URL を issuer から導出するためです。また、エンドポイントは管理サイトと同じサイトに置く必要があります。同意ページが管理セッションの Cookie に依存するためです。
マイグレーションを適用します:
python manage.py migrate django_admin_fastmcpこれ以外は何もありません。モデルごとの登録も、mixin も、デコレータもありません。サーバーは管理サイトがすでに公開しているものをそのまま公開します。
クライアントを接続する
サーバーを実行し(デプロイを参照)、登録します:
# Claude Code
claude mcp add --transport http acme-admin https://<host>/admin/mcp末尾にスラッシュのないパスを使用してください。/admin/mcp/ は /admin/mcp への 307 リダイレクトに応答しますが、すべてのクライアントが POST でリダイレクトに従うわけではありません。
トークンもヘッダーも不要です。最初の呼び出しで標準の MCP OAuth フローが開始されます:
クライアントが Django サイトの認可ページでブラウザを開きます。
管理セッションの Cookie があなたを識別します。ログアウトしている場合は、通常の管理ログインが最初に表示されます。
同意ページにクライアント名と承認の意味が表示されます。あなたが承認します。
クライアントはトークンを受け取り、接続します。トークンはクライアント自身が更新します。
ストリーミング HTTP と OAuth を話す MCP クライアントはどれも同じように動作します。たとえば Cursor や FastMCP の Client などです。
アクセスに関するルール:
スタッフユーザーは、自分自身に限り、クライアントを認可できます。
グラントはあなた自身の管理権限で動作し、それ以上にはなりません。別の権限システムはありません。管理サイトでモデルを変更できる人は、サーバーがそのモデルを
WRITABLE_MODELSにリストしている場合、MCP 経由でも変更できます。リフレッシュトークンは
REFRESH_TOKEN_TTL_DAYS(デフォルト 90)後に期限切れになるため、再同意がその頻度で発生します。失効はグラントの変更リストでの管理アクションです。
ツール
admin 名前空間の下にマウントされた11の汎用ツール。ワイヤー名は admin_list_models などです。各ツールは model を "app_label.ModelName" として受け取ります。ツールリストは静的です。ユーザーごとに異なるのは、各ツールがそのユーザーに何を見せ、何をさせるかです。
読み取り
ツール | 引数 | 戻り値 |
| なし | この呼び出し元が表示できるすべての公開モデルと権限フラグ。 |
|
| フィールド、リスト表示、フィルター、検索フィールド、読み取り専用フィールド、利用可能なアクション。 |
|
| 行と |
|
| 1つのシリアライズされたインスタンス。 |
|
| そのオブジェクトの管理ログエントリ(新しい順)。 |
|
| 管理ログエントリ。呼び出し元がスーパーユーザーでない限り、呼び出し元にスコープされます。 |
書き込み
書き込みツールは、モデルが WRITABLE_MODELS にリストされている必要があります。残りはモデルごと、オブジェクトごとに、あなた自身の管理権限が決定します。リストにないモデルは、誰が呼んでもすべての書き込みとすべてのアクションを拒否します。イベントログなどの機密モデルはリストから外しておけば、MCP クライアントがそれらに書き込むことは決してできません。
ツール | 引数 | 動作 |
|
| 管理フォームで検証し、保存してログを記録します。 |
|
| 部分更新。読み取り専用フィールドは無視されます。 |
|
|
|
|
| 管理アクションを実行します。 |
|
| 関連モデルを検索して、外部キー値を主キーに解決します。 |
返されるすべての行には pk が文字列として、admin_url が含まれるため、エージェントは人に実際の管理サイトへのリンクを渡すことができます。
設定
すべてのキーは ADMIN_FASTMCP ディクショナリにあります。不明なキーは起動時にエラーになります。
キー | デフォルト | 意味 |
|
| MCP サーバーが宣伝する名前。 |
|
|
|
|
|
|
|
| 拒否リスト。 |
|
| 書き込みを受け付けるモデル。空は書き込みなしを意味します。誰が呼んでもです。 |
|
| カタログから完全に削除されるツール名。 |
|
| フィールド名の部分一致。値は |
|
|
|
|
|
|
|
| アクセストークンの有効期間。クライアントはリフレッシュトークンで更新します。 |
|
| リフレッシュトークンの有効期間。再同意はこの頻度で発生します。 |
|
| Django サイトの公開 URL。OAuth の発行者であり、MCP サーバーはそれを認可サーバーとして指定します。 |
|
| MCP エンドポイントの公開 URL。 |
実際のデプロイでは SITE_URL と MCP_URL を設定してください。MCP_URL は、エンドポイントが提供されるパス、ディスカバリが宣伝する resource、すべてのトークンがバインドされるオーディエンスという、一致しなければならない3つのものの単一のソースです。そのパスはデフォルトで /admin/mcp です。起動時チェックは、パスのない MCP_URL を拒否します。その場合、オリジン全体が保護されたリソースとして宣伝されるためです。
ModelAdmin ごとのノブ
ModelAdmin クラスに設定します。mixin は不要です:
class InvoiceAdmin(admin.ModelAdmin):
mcp_expose = False # hide this model from MCP entirely
mcp_fields = ("number", "total") # allowlist of serialized fields
mcp_exclude_fields = ("internal_note",) # denylist of serialized fieldsREDACT_FIELDS は mcp_fields より優先されます。パスワードフィールドを明示的にリストしても、それは明かされません。
安全性
スーパーユーザー向けの管理 MCP サーバーは、言語モデルによって駆動される、本番データベース上のリモートシェルです。レール:
WRITABLE_MODELSはデフォルトで空なので、デプロイが名前を指定するまで、どのモデルも書き込みを受け付けません。それ以外はすべて、通常の Django 権限であり、呼び出しのたびにModelAdminを通じて問い合わせられます。アクセストークンは短命です。ソルト付きハッシュのみが保存されるため、漏洩したデータベース行を再生することはできません。
delete_objectとrun_actionはデフォルトでプレビューし、confirm=Trueまで何も変更しません。すべての変更は、グラントのユーザーに帰属する
LogEntryを記録し、変更メッセージにクライアント名が含まれます。例:"Changed status. Via MCP (client: Claude Code)."。LogEntryを記録できない書き込みはロールバックされます。パッケージ自身のモデル、
sessions.Session、authtoken.Tokenは、設定が何と言おうと公開されません。auth.Permissionとauth.GroupをWRITABLE_MODELSから外してください。権限を付与できるエージェントは、権限モデルから脱出できます。
デプロイ
別プロセス。 Django プロジェクトの隣で MCP サーバーを実行します:
python manage.py admin_mcp_serveMCP_URL のパス(デフォルトでは /admin/mcp)を、MCP_URL のポート(その URL がポートを指定しない場合は 8765)で提供します。どちらも --host と --port で上書きできます。既存の提供設定は何も変わりません。/admin/mcp をイングレス経由でそのポートにルーティングし、Authorization ヘッダーが通過することを確認してください。
マウント (M3)。 プロジェクトの asgi.py 内の /admin/mcp にサーバーをマウントします。1つの制約: 正確なパスでディスパッチします。OAuth エンドポイントは同じプレフィックスの直下(/admin/mcp/authorize など)にあり、Django はそれらを提供し続ける必要があるため、/admin/mcp の下のすべてを FastMCP に送るディスパッチャーはそれらを飲み込んでしまいます。レシピはマイルストーン M3 に同梱されています。
サーバーはステートレスなので、ロードバランサーの背後にあるどのインスタンスも任意のリクエストを提供できます。
開発
make install # bootstrap uv, pin Python, install dependencies
make test # run the permission matrix
make check # format, lint, typecheck, and test
make migrate # migrate the test project
make serve # run the MCP server against the test project on :8765/admin/mcp
make help # everything elseライセンス
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for AI dialogue using various LLM models via AceDataCloud
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/edelvalle/django-admin-fastmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server