Exposes /.well-known/mcp-server on your Django project so AI agents
can discover it via mcp://. Implements
draft-serra-mcp-discovery-uri-03.
pip install django-mcp-discovery1. Add to INSTALLED_APPS:
INSTALLED_APPS = [
...
'mcp_discovery',
]2. Include URLs:
urlpatterns = [
...
path('', include('mcp_discovery.urls')),
]3. Done. Visit https://yoursite.com/.well-known/mcp-server.
MCP_DISCOVERY = {
'NAME': 'My Site MCP Server',
'ENDPOINT': 'https://mysite.com/mcp/',
'DESCRIPTION': 'Natural language description of the server',
'AUTH': 'none', # none | apikey | oauth2
'CAPABILITIES': ['tools', 'resources'],
'CATEGORIES': ['e-commerce', 'fashion'],
'LANGUAGES': ['it', 'en'],
'CONTACT': 'api@mysite.com',
'DOCS': 'https://mysite.com/mcp/docs/',
'EXPIRES_DAYS': 90, # manifest expiry in days
'CRAWL': True, # False to opt out of indexing
# Optional — primitive previews (draft-03 Section 6.10)
# Use a list for static tools, or 'dynamic' for dynamic ones
'TOOLS_PREVIEW': [
{'name': 'search_products', 'description': 'Search by category'},
{'name': 'check_stock', 'description': 'Real-time availability'},
],
'RESOURCES_PREVIEW': 'dynamic',
'PROMPTS_PREVIEW': 'dynamic',
}Auto-detected if not set:
- Name — from
django.contrib.sitesorSITE_NAMEsetting - Endpoint — from
SITE_URLor first non-localhostALLOWED_HOSTS - Language — from
LANGUAGE_CODEsetting
Minimal (no configuration):
{
"mcp_version": "2025-06-18",
"name": "My Shop MCP Server",
"endpoint": "https://myshop.com/mcp/",
"transport": "http",
"auth": { "type": "none" },
"capabilities": ["tools", "resources"],
"languages": ["it"],
"last_updated": "2026-03-25T00:00:00+00:00",
"expires": "2026-09-23T00:00:00+00:00",
"crawl": true
}With tools_preview (draft-03 Section 6.10):
{
"mcp_version": "2025-06-18",
"name": "My Shop MCP Server",
"endpoint": "https://myshop.com/mcp/",
"transport": "http",
"auth": { "type": "none" },
"capabilities": ["tools", "resources"],
"categories": ["e-commerce"],
"languages": ["it"],
"expires": "2026-09-23T00:00:00+00:00",
"crawl": true,
"tools_preview": [
{
"name": "search_products",
"description": "Search products by category and material"
},
{
"name": "check_stock",
"description": "Check real-time warehouse availability"
}
],
"resources_preview": "dynamic",
"prompts_preview": "dynamic"
}- Endpoint domain validation — custom endpoint MUST be on same domain or subdomain. Invalid endpoints fall back to default. (draft-03 Section 6.8)
- Expires field — manifest declares its own expiry date. (draft-03 Section 6.9)
- Added
tools_preview,resources_preview,prompts_previewfields (draft-03 Section 6.10) - Use a list for static previews, or 'dynamic' for dynamic ones
- Security: endpoint domain validation (Section 6.8)
- Security:
expiresfield withEXPIRES_DAYSsetting (Section 6.9)
- Initial release
- mcpstandard.dev — specification
- IETF Draft -03
- GitHub Discussion #2462
- WordPress plugin
Mumble Group — Milan, Italy — support@mumble.group