Configuration
Dj Signals Panel works out of the box with no required configuration. All options are set via a DJ_SIGNALS_PANEL_SETTINGS dict in your Django settings.
For access control specifically (locking down individual views or MCP tools by group), see Scopes.
DJ_SIGNALS_PANEL_SETTINGS = {
'SHOW_SOURCE': False,
'SIGNAL_MODULES': [],
'LOAD_DEFAULT_CSS': True,
'EXTRA_CSS': [],
}
Settings Reference
SHOW_SOURCE
Type: bool
Default: False
Description: Every receiver row on the signal detail page includes an expandable section for its file path/line (labelled View Location). When SHOW_SOURCE is True, that same section is relabelled View Source and additionally renders the receiver's source code with syntax highlighting.
SIGNAL_MODULES
Type: list[str]
Default: []
Description: Additional Python module paths to include in signal discovery, on top of what is found automatically. Useful when your signals are defined in modules that are not picked up by default.
LOAD_DEFAULT_CSS
Type: bool
Default: True
Description: Whether to load the built-in Signals Panel stylesheet. Set to False to provide your own styles from scratch.
EXTRA_CSS
Type: list[str]
Default: []
Description: Additional stylesheets to load after the default CSS. Accepts static file paths or full URLs.
Static file paths are relative to your app's static/ subdirectory (same convention as Django's {% static %} tag). A file at myapp/static/myapp/css/overrides.css is referenced as myapp/css/overrides.css.
DJ_SIGNALS_PANEL_SETTINGS = {
'EXTRA_CSS': [
# File lives at: myapp/static/myapp/css/overrides.css
'myapp/css/overrides.css',
# Full URLs are also supported
'https://cdn.example.com/theme.css',
],
}
Theme adapters
Dj Signals Panel builds on dj-control-room-base, which ships optional token-override stylesheets for admin skins that don't match the classic Django admin palette. These aren't loaded automatically - add the one you need to EXTRA_CSS:
Currently available:
| File | For |
|---|---|
themes/unfold.css |
Projects using django-unfold as their admin skin. |
themes/unfold.css remaps Dj Signals Panel's accent/surface/border/muted tokens to Unfold's own CSS variables, so the panel matches the host site's configured brand color instead of the classic-admin blue.

See the dj-control-room-base configuration docs for more on how theme adapters work and how to build your own.
Panel Tools (MCP)
Dj Signals Panel ships dj_signals_panel/tools.py, a ToolRegistry of MCP-facing tools that dj-control-room aggregates and exposes to AI agents (Cursor, Claude, etc.) over its MCP endpoint.
| Tool | Description |
|---|---|
list_signals |
List every signal Dj Signals Panel can see (Django built-ins and app-defined), with receiver counts and bound senders. Filter by app_label and query. |
get_receivers |
List the receivers connected to a signal: dotted path, dispatch_uid, weak/strong ref, and sender filter. Look up by signal (dotted signal id). |
find_signal_by_sender |
Reverse lookup: given a model, find every signal/receiver that fires for it (e.g. "what fires when Order is saved"). |
inspect_receiver |
Resolve a receiver's dotted_path to its source file/line and any signals it's currently connected to, so an agent can jump straight to the function instead of grepping. |
inspect_receiver only returns metadata by default. Enable a source code preview in its results with the same SHOW_SOURCE setting used by the admin UI's receiver detail view:
SCOPE_PERMISSIONS
Type: dict
Default: {}
Description: Restrict individual tool scopes (or view scopes) independently of the panel's default permission checks. Each of the four panel tools ships under its own scope (agent_signal_list, agent_receiver_list, agent_signal_lookup, agent_receiver_inspect), separate from the view scopes humans hit in the admin UI, so agent access can be governed independently.
DJ_SIGNALS_PANEL_SETTINGS = {
'SCOPE_PERMISSIONS': {
'agent_receiver_inspect': {'ALLOWED_GROUPS': ['ai-agents']},
},
}
See Scopes for the full list of view and tool scopes, and the dj-control-room-base Panel Tools guide for the underlying API.
URLs Configuration
# urls.py
urlpatterns = [
path('admin/dj-signals-panel/', include('dj_signals_panel.urls')),
path('admin/', admin.site.urls),
]
Security
Dj Signals Panel uses Django's built-in admin authentication:
- Only staff users (
is_staff=True) can access the panel - All views require authentication via
@staff_member_required - No additional security configuration needed