Django FastMCP集成工具

该项目将FastMCP集成到Django ASGI应用程序中,支持OAuth2 Bearer令牌和基于会话的认证,适用于需要实时工具API与Django后台结合的场景。

  • by andychoi
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 andychoi/django-mcp-inspector

使用说明

Django+快速MCP+MCP检查器

该项目将FastMCP与Django ASGI应用程序集成,支持OAuth2承载令牌和基于会话的身份验证。

该项目将FastMCP(模型上下文协议)集成到Django ASGI应用程序中。它实现了基于Node.js的MCP Inspector工具和Django支持的FastMCP工具之间的安全、可流式和经过身份验证的通信。

✅ 特征:

  • 通过Django OAuth工具包进行OAuth2和基于会话的身份验证
  • MCP检查器中继会话的代理令牌支持
  • MCP客户端通信的流式HTTP传输支持
  • OAuth发现的元数据端点
  • 用于混合承载+会话认证的可插拔中间件

非常适合使用MCP Inspector将Django admin/UX与实时工具API相结合的设置。

  • 测试管理员用户:demo/demo

📦 项目结构

.
├── djproject/
│   ├── settings.py
│   └── asgi.py  ← Mounts MCP app
├── mcp_app/
│   ├── auth_middleware.py
│   └── mcp_server.py
├── manage.py
└── requirements.txt

⚙️ 安装说明

1.安装要求

pip install -r requirements.txt

确保 django, django-oauth-toolkit,以及 fastmcp 包括在内。

2.Django设置

确保您的 INSTALLED_APPS 包括:

"oauth2_provider",
"mcp_app",

3.在中配置ASGI asgi.py

from starlette.applications import Starlette
from starlette.routing import Mount, Route
from starlette.middleware.cors import CORSMiddleware
from starlette.middleware import Middleware
from starlette.staticfiles import StaticFiles
from django.core.asgi import get_asgi_application
from pathlib import Path
from django.conf import settings

from mcp_app.mcp_server import djmcp as mcp_instance
from mcp_app.auth_middleware import CombinedAuthMiddleware
from mcp_app.metadata import oauth_authorization_server, oauth_protected_resource

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djproject.settings")

django_application = get_asgi_application()

middleware = [
    Middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]),
    Middleware(CombinedAuthMiddleware),
]

mcp_asgi_app = mcp_instance.http_app(path="/", middleware=middleware)

application = Starlette(
    routes=[
        Route("/.well-known/oauth-authorization-server", oauth_authorization_server, methods=["GET", "OPTIONS"]),
        Route("/.well-known/oauth-protected-resource", oauth_protected_resource, methods=["GET", "OPTIONS"]),
        Mount("/mcp", mcp_asgi_app),
        Mount("/", django_application),
    ],
    lifespan=mcp_asgi_app.lifespan
)

if settings.STATIC_ROOT and Path(settings.STATIC_ROOT).exists():
    application.routes.insert(
        2,
        Mount("/static", StaticFiles(directory=settings.STATIC_ROOT), name="static")
    )

🔐 组合认证中间件

位于 mcp_app/auth_middleware.py.

  • 检查 Authorization: Bearer ... 并使用DOT进行验证
  • 回到Django sessionid 曲奇
  • 接受 x-mcp-proxy-session-token 用于受信任的代理转发请求

🛠️ MCP工具示例

from fastmcp import FastMCP

djmcp = FastMCP(name="django_mcp")

@djmcp.tool
def echo(message: str) -> str:
    return f'{{"Echo": "{message}"}}'

🧪 调试提示

  • 确保 is_valid() 来自DOT的数据在没有参数的情况下使用。
  • 中间件记录错误 logger.error(...) 如果响应失败。
  • 请注意: _StreamingResponse 对象不支持 .body().

许可证

该项目根据MIT许可证获得许可。请随时根据自己的需求进行调整和扩展。