Configuration
All settings are managed via Admin Tools > Settings > Extension Configuration > nr_mcp_agent.
LLM connection
llmTaskUid
-
- Type
- int
- Default
- 0
UID of an nr-llm Task record. This Task defines which LLM provider and model to use (e.g. OpenAI GPT-4, Anthropic Claude). Required -- the extension will not work without a valid Task UID.
Create the Task record in the nr-llm backend module first, then enter its UID here.
Processing
processingStrategy
-
- Type
- string
- Default
- exec
How chat messages are processed in the background:
exec- Forks a CLI process per request
(
ai-chat:process). Simple, no extra setup. Best for development and low-traffic sites. worker- Uses a long-running worker process
(
ai-chat:worker) that polls for new messages. Better for production -- lower latency, no process forking overhead.
Access control
allowedGroups
-
- Type
- string
- Default
- (empty)
Comma-separated list of backend user group UIDs that are allowed to use the AI Chat module. Leave empty to allow all backend users with module access.
MCP integration
enableMcp
-
- Type
- boolean
- Default
- false
Enable MCP (Model Context Protocol) server integration.
When enabled, the AI assistant can call tools exposed by any configured MCP server. When disabled, it works as a plain chat without tool access.
MCP servers are configured as records in the TYPO3 List module (see MCP server records below).
MCP server records
MCP servers are configured as database records, not via extension settings. After enabling MCP:
- Open the TYPO3 List module and navigate to pid = 0 (the root page).
- Create a new record of type MCP Server.
-
Fill in the fields:
Name- Human-readable label (e.g. TYPO3 MCP Server).
Server key- Machine identifier used to namespace tools
(e.g.
typo3). Lowercase letters, digits, and underscores only. Must be unique. Transportstdio(subprocess via stdin/stdout) orsse(HTTP SSE endpoint — not yet implemented).
For
stdiotransport:Command- Path to the MCP server binary. Defaults to
vendor/bin/typo3in the project root. Arguments- One argument per line (e.g.
mcp:server).
- Save the record. The tool cache is flushed automatically.
Tool names are prefixed with the server key to avoid
collisions between servers. For example, a tool named
ReadTable on a server with key typo3 becomes
typo3__ReadTable in the LLM context.
The connection status fields (read-only) show the last known state of each server connection.
Chat panel
When llmTaskUid is configured, a chat button appears
automatically in the TYPO3 backend toolbar (top right).
Clicking it opens a floating bottom panel that stays visible
across module navigation.
The panel supports four states:
- Hidden -- Default. Only the toolbar button is visible.
- Collapsed -- Minimal header bar showing the active conversation title and status.
- Expanded -- Resizable panel with chat messages, input, and a compact conversation switcher.
- Maximized -- Full-height panel with a sidebar for conversation management (search, pin, archive).
The panel height and state are persisted per user in the browser's localStorage.
System prompt
The system prompt sent to the LLM is not configured in the extension configuration itself, but in the nr-llm records:
- Configuration record (
tx_nrllm_configuration.system_prompt) -
The primary system prompt. Set this to define the AI assistant's persona, language, and behavior. Also use this field for tool usage instructions when MCP is enabled.
Example for MCP usage:
Du bist ein TYPO3-Assistent. ## Tool-Nutzung - Bei WriteTable gehören Record-Felder IMMER in den "data" Parameter als Objekt. - Beispiel: {"action": "create", "table": "pages", "pid": 1, "data": {"title": "Meine Seite"}}Copied! - Task record (
tx_nrllm_task.prompt_template) - Additional instructions appended after the Configuration prompt. Use this for task-specific context.
When both fields are set, they are combined (separated by a
blank line). If neither is set, a locale-based default prompt
is used. A per-conversation system_prompt field can
override everything (set programmatically, not via UI).
User interface
maxConversationsPerUser
-
- Type
- int
- Default
- 50
Maximum number of conversations to keep per user. Set to
0for unlimited. When the limit is reached, the oldest non-pinned conversations are archived automatically.
autoArchiveDays
-
- Type
- int
- Default
- 30
Automatically archive conversations that have been inactive for this many days. Set to
0to disable auto-archiving.Auto-archiving runs via the
ai-chat:cleanupcommand.
File attachments
File attachments are always available — no special provider configuration required. Text is extracted server-side for document formats, so they work with any LLM provider.
Always supported (server-side text extraction):
- PDF:
application/pdf— requiressmalot/pdfparser(hard dependency) - DOCX:
application/vnd.openxmlformats-officedocument.wordprocessingml.document— requiresphpoffice/phpword(hard dependency) - TXT:
text/plain— no dependencies - XLSX:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet— requiresphpoffice/phpspreadsheet(optional; install viacomposer require phpoffice/phpspreadsheet:^3.0)
Additionally available for vision-capable providers (Claude 3+, Gemini, GPT-4o, etc.):
- Images:
image/png,image/jpeg,image/webp
When the provider natively handles a document format (e.g. Claude
natively processes PDFs via DocumentCapableInterface), the file is
sent as binary instead of being extracted. The file picker automatically
restricts to formats the active provider can process.
Storage: Uploaded files are stored in TYPO3 FAL under
fileadmin/ai-chat/<be_user_uid>/. They are read at LLM call time and
sent as Base64-encoded multimodal content. Each file is stored in a
user-specific subfolder; the API enforces that users can only attach their
own files (cross-user access attempts return 404).
Limits:
- Maximum 5 files per conversation.
- Maximum file size: 20 MB per file.
- File count is enforced both in the frontend (before upload) and in the backend API.
Security: The fileadmin/ai-chat/ directory should be protected
from direct HTTP access. Add the following to your web server configuration
or deploy a .htaccess file to fileadmin/ai-chat/:
# fileadmin/ai-chat/.htaccess
Require all denied
Security
maxMessageLength
-
- Type
- int
- Default
- 10000
Maximum length of a single user message in characters. Set to
0for unlimited (not recommended).Messages exceeding this limit are rejected with an error.
maxActiveConversationsPerUser
-
- Type
- int
- Default
- 3
Maximum number of simultaneously active (processing) conversations per user. Prevents a single user from overloading the system. Set to
0for unlimited.
Worker mode production setup
For production use with processingStrategy = worker,
set up a systemd service to keep the worker running:
# /etc/systemd/system/typo3-ai-chat-worker.service
[Unit]
Description=TYPO3 AI Chat Worker
After=mysql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/html
ExecStart=/var/www/html/vendor/bin/typo3 \
ai-chat:worker --poll-interval=200
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable typo3-ai-chat-worker
sudo systemctl start typo3-ai-chat-worker
Scheduled cleanup
Add the cleanup command to your cron or TYPO3 scheduler to handle stuck conversations, auto-archiving, and deletion of old data:
# Run cleanup daily at 3:00 AM
0 3 * * * /var/www/html/vendor/bin/typo3 \
ai-chat:cleanup --delete-after-days=90