近年、LLM(大規模言語モデル)に外部のデータベースやAPIツールを統合するための統一規格として MCP(Model Context Protocol) が急速に広まっています。AIエージェントに自社サービスの機能を提供したい場合、MCPサーバーの構築は非常に強力な選択肢です。
しかし、「MCP用にわざわざ別サーバーを立てたり、APIロジックを二重で管理したりしたくない……」と感じる方も多いのではないでしょうか?
本記事では、Pythonのモダンで高速なAPIフレームワークである Django-Ninja をベースに、単一のDjangoサーバー上で「Webサービス」「REST API」「MCPサービス」をまとめてホストする構成 を紹介します。既存のDjango APIエンドポイントをそのままMCPツールとして活用できるため、エージェント連携のオーバーヘッドを劇的に削減できます。
注意
本記事で紹介する方法は、プレビュー版(アルファ版)のパッケージ(django-ninja-mcp 等)を使用しています。将来的な仕様変更の可能性がある点をご理解の上でお試しください。
利用ソフトウェアのバージョン
- uv: 0.12.2
- mcp: 1.6.0
- django: 5.2
- django-ninja: 改造版(環境構築参照)
- django-ninja-mcp: 0.0.1a2
- Bionic(クライアントとして確認用): 1.0.6+5
サンプルサーバー構築
以下の手順は、macOSで確認しています。
環境構築
uvでsampleというフォルダーを作りDjangoの環境構築をします。
uv init --no-package -p 3.14 sample
cd sample
mkdir src
rm main.py
uv add \
"mcp==1.6.0" \
"django==5.2" \
"django-ninja@git+https://github.com/mikeedjones/django-ninja.git@a1a5273" \
"django-ninja-mcp==0.0.1a2"
プロジェクトとアプリの作成
以下のようにしてプロジェクトとアプリを作成します。
uv run django-admin startproject project src
uv run --directory src manage.py startapp core
実装
settings.pyに設定を、urls.pyにルーティングを、api.pyにAPIの実装を追加します。
ここでは、weatherというサービスを実装します。
src/project/settings.py抜粋
# 既存の INSTALLED_APPS に daphne, ninja, core アプリを追加
INSTALLED_APPS = [
"daphne",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"ninja",
"core.apps.CoreConfig",
]
ASGI_APPLICATION = "project.asgi.application"
src/project/urls.py
from django.contrib import admin
from django.urls import path
from core.api import api
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", api.urls),
]
src/core/api.py
from ninja import NinjaAPI
from ninja_mcp import NinjaMCP
api = NinjaAPI()
@api.get("/weather/{city}")
def weather(request, city: str) -> dict[str, str]:
"""都市の天気"""
return {"message": f"{city}の天気は曇りのち晴れ"}
mcp_server = NinjaMCP(
ninja=api,
base_url="http://localhost:8000/api",
name="Sample API",
description="API with MCP integration",
)
mcp_server.mount(api, mount_path="/mcp")
実行
マイグレーションを実行し、サーバーを起動します。
uv run --directory src manage.py migrate
uv run --directory src manage.py runserver
Web確認
http://localhost:8000/adminでWebを確認できます。以下でユーザーを作成するとログインできます。
uv run --directory src manage.py createsuperuser
API確認
http://localhost:8000/api/docsでAPIを確認できます。
MCP確認
ここではBionicで確認します。以下からダウンロードしてインストールできます。
MCP設定
Bionicを起動したら設定画面(⌘+カンマ)を開き、左のタブの「Connected Apps」を選んでください。
右下の「Add custom MCP」で開く画面で以下を設定し、「Add MCP」を押してください。
- Name: Weather
- Connection: Web address
- Server address: http://localhost:8000/api/mcp
左上の「Back to app」で戻り、チャット画面を開いてください。
「東京の天気」を入力してください。
「東京の天気は曇りのち晴れです。」と帰ってきたら成功です。
参考
下記は django-ninja-mcp を使わない紹介記事です。独自実装のため、Djangoなどの最新版を利用しやすいです。
