Skip to main content

django-stateless-mcp

PyPI version Documentation status

A stateless Model Context Protocol server for Django, built on the 2026-07-28 spec. An MCP endpoint becomes an ordinary Django view — no sessions, no SSE, no sticky routing, and no dedicated single-process service.

Why stateless

Before 2026-07-28, MCP needed a persistent connection: elicitation held an open stream and a blocked worker, so a reply that round-robined to another worker failed. The 2026-07-28 spec makes MCP plain request/response HTTP — Django's home turf — and turns elicitation into a retry any instance can serve. That is the change this package is built on; see Why stateless for the full story.

Usage

# myproject/mcp.py
from mcp.server.mcpserver import MCPServer

from django_stateless_mcp import request_state_security

server = MCPServer(
    name="my-server",
    version="1.0.0",
    request_state_security=request_state_security(),
)


@server.tool()
def add(a: int, b: int) -> int:
    """Add two integers."""
    return a + b
# urls.py
from django.urls import path

from django_stateless_mcp import mcp_view
from myproject.mcp import server

urlpatterns = [path("mcp/", mcp_view(server))]

That is the whole integration. The endpoint runs under both WSGI and ASGI.

What it provides

  • mcp_view(server) — serve an MCPServer as a stateless streamable-HTTP Django view, optionally requiring OAuth bearer auth via a token_verifier.
  • mcp.py autodiscovery — add django_stateless_mcp to INSTALLED_APPS and each app's mcp.py registers tools, like admin.py.
  • request_state_security() — key the SDK's elicitation-resume encryption from SECRET_KEY, so elicitation survives a multi-worker deployment.
  • django_request(ctx) — reach the authenticated Django request from inside a tool, with no global state.
  • StructlogRequestLogger — optional flow-logging middleware.

Tool registration, elicitation, resources and prompts are the MCP SDK's own API; this package is the Django layer around it.

Supported versions

  • Python 3.10–3.14 (3.10 and 3.11 with Django 5.2 LTS only, matching Django's own support)
  • Django 5.2 LTS and 6.0
  • mcp 2.0.x

Each is exercised in CI, along with an advisory job tracking the SDK's git main.

Try it live

The repo ships a runnable example project. just demo-asgi starts it behind four worker processes; the example README walks through watching an elicitation started on one worker resume on another — the package's thesis, observable with curl or any MCP client.

Documentation

Full documentation, including a worked elicitation example and the design decisions behind the package, is at https://django-stateless-mcp.readthedocs.io/.

Development

Contributors: ARCHITECTURE.md maps how the package works and the invariants every change must preserve.

git clone git@github.com:Streamlined-Analytics/django-stateless-mcp.git
cd django-stateless-mcp
uv sync

uv run pytest                        # quick run: locked Django
uvx --with tox-uv tox run -f py313   # the full matrix: Django 5.2 + 6.0
just qa                              # format, lint, type check, test
just conformance                     # the official MCP conformance suite

Author

django-stateless-mcp was created in 2026 by Ben Atkinson.

Started from the audreyfeldroy/cookiecutter-pypackage template.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_stateless_mcp-0.1.6.tar.gz (233.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_stateless_mcp-0.1.6-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file django_stateless_mcp-0.1.6.tar.gz.

File metadata

  • Download URL: django_stateless_mcp-0.1.6.tar.gz
  • Upload date:
  • Size: 233.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for django_stateless_mcp-0.1.6.tar.gz
Algorithm Hash digest
SHA256 b76756d991bd0449fbb0ab08607628e74d508fd11984c97755f56471d7b9f744
MD5 9e8f652f73503c1c7dddb1818215dd4b
BLAKE2b-256 b6802307f955ba67d9035ad9aa28b48491a13ee91e4f9c7104d67ba629ef46db

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_stateless_mcp-0.1.6.tar.gz:

Publisher: publish.yml on Streamlined-Analytics/django-stateless-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_stateless_mcp-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for django_stateless_mcp-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 4b2062051695c463ee9ea903978544f67d8589281484f3be55e71c65e645574a
MD5 41db3002f953c46540d18016c3931b12
BLAKE2b-256 5dd7375f611e70608ade00a9f2b8e58d96523cffbb8093933428ef6fd7116f0f

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_stateless_mcp-0.1.6-py3-none-any.whl:

Publisher: publish.yml on Streamlined-Analytics/django-stateless-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

This release

0.1.6 This release

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page