MCP server and CLI that analyses a Django project instead of describing it: cascades, N+1, migration safety, tenant leaks, signal chains, transaction side effects, API contract drift.
Strong tool coverage (37 tools) with consistent naming patterns and detailed descriptions. Most tools follow verb_noun convention (delete_impact, explain_model, list_models). Descriptions are substantive (100-400 chars typical), explaining WHAT the tool does and WHEN to use it. Input schemas present for all tools with type definitions and parameter descriptions. However, output schemas are not documented in the visible code, LLMs cannot infer what fields to expect from responses. Error handling guidance is absent; tools do not indicate recovery paths or categorize failures. No tool annotations (readOnlyHint/destructiveHint) despite 36/37 being read-only. Parameter descriptions could be more prescriptive about formats and constraints.
Which endpoints can reach which models without authentication.
N+1 queries in a template.
Blocking calls in async functions that will freeze the event loop.
Side effects that run outside any transaction.
Celery tasks and their arguments.
Run all checks and return a single verdict.
Choices that are never used.
Snapshot the API contract: what fields each endpoint exposes.
Output schemas not documented. LLMs cannot infer response structure, field names, or types. This forces agents to guess what data is available and risks parsing failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Compare the current API contract against a snapshot.
Links, templates, receivers and scheduled tasks that are already dead.
Datetime fields that are not timezone-aware.
prefetch_related that is defeated by filtering after the prefetch.
What will cascade when this model is deleted.
What will break when I deploy?
How many queries one request to each endpoint will cost. Every tool that answers this runs the application and tells you afterwards: the debug toolbar, silk, assertNumQueries. The number is derivable before anything runs. One query for the page, plus one per object for every serializer field crossing a relation the view did not prefetch, plus that again per level of nesting. On the demo project the same serializer measured 2852 queries behind an unoptimised queryset and 2 behind an optimised one. The ratio is the reliable part; the absolute number is only as good as nested_fan_out.
Side effects that escape the transaction they are in.
Everything about one model: fields, relations, risks, ownership.
FastAPI endpoints that expose more than they should.
Queries that do not filter by the tenant.
Every model in the project.
Migrations that will fail or corrupt data.
Report fields the code filters or sorts on that carry no index. Args: search_path: directory to scan. Defaults to the project path. min_occurrences: only report a field asked for at least this often.
Money fields that will lose precision.
Aggregates that will be multiplied by joins.
Endpoints that do not require authentication.
Check that the target Django project loads, and report what it is. Run this first when something is not working. It is the smallest call that proves both halves of the setup: the MCP transport and the Django boot.
The model graph as a resource.
Queries inside loops that will N+1 when the loop grows.
Concurrent requests that can corrupt data.
Which models each endpoint touches.
Every template in the project.
DRF serializers that expose more than they should.
N+1 queries in DRF serializers.
N+1 queries in SQLAlchemy code.
Suggested fixes for findings.
select_related and prefetch_related that fetch data never used.
What happens when a model is saved, deleted, or created.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). 36 of 37 tools are read-only; marking them enables agents to optimize retry logic and understand safety guarantees.
No error handling guidance. Tools do not indicate what to do on failure, whether errors are retryable, or how to recover. Agents cannot self-correct.
Parameter descriptions lack prescriptive format/constraint details. E.g., 'search_path' and 'tenant_root' do not specify expected formats, valid ranges, or examples. LLMs may pass invalid values.
STDIO transport only. Server is not remotely accessible and cannot be used by hosted MCP clients. Limits deployment flexibility.