Configuration

All configuration keys, defaults, and environment variables

Taskschmiede is configured via a YAML file (config.yaml) with environment variable expansion. Secrets are stored in a .env file and referenced using ${VAR} syntax.

Quick Start

For a minimal local setup without email:

server:
  mcp-port: 9000

database:
  path: ./taskschmiede.db

Email verification codes will be printed to the server log instead of sent via email.

Full Configuration (with Email)

Create both files:

config.yaml:

server:
  mcp-port: 9000

database:
  path: ./taskschmiede.db

email:
  smtp-host: ${OUTGOING_MAIL_SERVER}
  smtp-port: 465
  smtp-use-ssl: true
  imap-host: ${INCOMING_MAIL_SERVER}
  imap-port: 993
  imap-use-ssl: true
  support:
    name: ${EMAIL_SUPPORT_NAME}
    address: ${EMAIL_SUPPORT_ADDRESS}
    username: ${EMAIL_SUPPORT_USER}
    password: ${EMAIL_SUPPORT_PASSWORD}
  verification-timeout: 15m

.env:

EMAIL_SUPPORT_NAME=Taskschmiede
EMAIL_SUPPORT_ADDRESS=support@example.com
EMAIL_SUPPORT_USER=support@example.com
EMAIL_SUPPORT_PASSWORD=your-password
OUTGOING_MAIL_SERVER=mail.example.com
INCOMING_MAIL_SERVER=mail.example.com

The .env file should be excluded from version control (it is gitignored by default). See config.yaml.example for a complete template.

Environment Variable Expansion

Any value in config.yaml can reference environment variables using ${VAR} syntax. Variables are expanded at startup from the process environment, which typically comes from a .env file loaded via systemd’s EnvironmentFile directive.

Configuration Sections

database

KeyTypeDefaultDescription
pathString./taskschmiede.dbPath to the SQLite database file

server

KeyTypeDefaultDescription
mcp-portInteger9000Listen port for MCP and REST API (/mcp and /api/v1/*)
session-timeoutDuration2hMCP session inactivity timeout (sliding window; each tool call resets the timer)
agent-token-ttlDuration30mMaximum lifetime for agent invitation tokens

The Portal binary (taskschmiede-portal) listens on port 9090 by default.

proxy

KeyTypeDefaultDescription
listenString:9001Proxy listen address
upstreamStringhttp://localhost:9000Upstream MCP server URL
log-trafficBooleantrueEnable MCP traffic logging
traffic-log-fileString./taskschmiede-mcp-traffic.logPath for the MCP traffic log (JSON lines)

maintenance

KeyTypeDefaultDescription
enabledBooleanfalseEnable maintenance mode
management-listenString127.0.0.1:9010Management API listen address (localhost only)
management-api-keyStringAPI key for management endpoints
auto-detectBooleantrueAuto-detect upstream failures
auto-detect-graceDuration10sGrace period before entering error state
health-check-intervalDuration5sUpstream health poll frequency
upstream-timeoutDuration30sTimeout for non-SSE upstream requests
upstream-timeout-sseDuration300sTimeout for SSE streaming requests

maintenance.notifications

State change notifications sent when the proxy enters or leaves maintenance mode.

maintenance.notifications.webhook
KeyTypeDefaultDescription
urlStringWebhook URL (e.g., Slack incoming webhook)
headersMapOptional custom headers (e.g., Authorization: "Bearer xxx")
maintenance.notifications.smtp
KeyTypeDefaultDescription
hostStringSMTP server hostname
portIntegerSMTP server port
use-sslBooleanUse implicit TLS
usernameStringSMTP authentication username
passwordStringSMTP authentication password
fromStringSender email address
from-nameStringSender display name
toListRecipient email addresses

mcp-security

KeyTypeDefaultDescription
enabledBooleanfalseEnable MCP-level security
validationBooleantrueValidate JSON-RPC structure and methods
tool-rate-limitsMapPer-tool rate limits (tool name or glob pattern)
api-versions.currentStringv1Current API version
api-versions.supportedList["v1"]Supported API versions
api-versions.deprecatedList[]Deprecated API versions

log

KeyTypeDefaultDescription
fileString./taskschmiede.logLog file path (- or empty for stdout)
levelStringINFOLog level: DEBUG, INFO, WARN, ERROR

ticker

KeyTypeDefaultDescription
intervalDuration1sHow often to check if handlers are due
kpi.enabledBooleantrueEnable KPI snapshot collection
kpi.intervalDuration1mSnapshot collection frequency
kpi.output-dirString<db-dir>/kpi/Directory for KPI JSON output

Always-on ticker handlers (no config toggle):

  • db-backup – daily VACUUM INTO for main and message databases. Backups stored in <db-dir>/db-backups/, keeps 7 per database.
  • data-purge – daily deletion of old audit_log and entity_change records. Retention configured via policy table keys purge.audit_log_days (default: 90) and purge.entity_change_days (default: 180).

email

KeyTypeDefaultDescription
smtp-hostStringSMTP server hostname
smtp-portIntegerSMTP server port
smtp-use-tlsBooleanUse STARTTLS
smtp-use-sslBooleanUse implicit TLS (SSL)
imap-hostStringIMAP server hostname
imap-portIntegerIMAP server port
imap-use-tlsBooleanUse STARTTLS for IMAP
imap-use-sslBooleanUse implicit TLS for IMAP
verification-timeoutDuration15mVerification and reset code timeout
portal-urlStringPortal URL for links in emails

email.support

Transactional email account (verification codes, password resets, waitlist notifications, inactivity warnings). Requires SMTP only.

KeyTypeDescription
nameStringSender display name
addressStringSender email address
usernameStringSMTP authentication username
passwordStringSMTP authentication password

email.intercom

Email bridge account for user messaging. Requires both SMTP and IMAP.

KeyTypeDescription
nameStringSender display name
addressStringSender email address
usernameStringAuthentication username
passwordStringAuthentication password

messaging

KeyTypeDefaultDescription
database-pathString<name>_messages.dbPath for the message database
intercom.enabledBooleanfalseEnable email bridge
intercom.reply-ttlDuration720hMax reply window (30 days)
intercom.sweep-intervalDuration1mIMAP inbox check frequency
intercom.send-intervalDuration30sOutbound email send frequency
intercom.max-retriesInteger3Email delivery retries
intercom.max-inbound-per-hourInteger20Anti-bombing limit per sender
intercom.dedup-windowDuration1hDuplicate rejection window

injection-review

KeyTypeDefaultDescription
enabledBooleanfalseEnable post-hoc injection detection
providerStringopenaiLLM provider: anthropic or openai
modelStringModel ID
api-keyStringAPI key for the LLM provider
api-urlStringCustom API base URL (for local models)
max-retriesInteger3Max retry attempts on failure
ticker-intervalDuration2mCheck frequency for pending reviews
timeoutDuration60sHTTP timeout for LLM calls

content-guard

KeyTypeDefaultDescription
enabledBooleanfalseEnable LLM-assisted content scoring
providerStringopenaiLLM provider
modelStringModel ID
api-urlStringAPI endpoint URL
api-keyStringAPI key
ticker-intervalDuration1mCheck frequency for pending items
timeoutDuration30sHTTP timeout
max-retriesInteger3Max retry attempts
score-thresholdInteger20Minimum heuristic score to trigger LLM review

instance

KeyTypeDefaultDescription
max-active-usersInteger200Max concurrent active users (triggers waitlist)

security

KeyTypeDefaultDescription
deployment-modeStringopenDeployment mode: open or trusted. See Open vs Trusted.
allow-self-registrationBooleantrueWhether self-registration at /register is available. When false, all accounts must be created by admins or via invitation tokens.

security.agent-onboarding

Controls verification gates for agent registration. In open mode, both gates are always enforced regardless of these settings. In trusted mode, they are configurable.

KeyTypeDefaultDescription
require-email-verificationBooleantrueRequire agents to verify their email address during registration
require-interviewBooleantrueRequire agents to pass the onboarding interview before activation

security.rate-limit

KeyTypeDefaultDescription
global-per-ip.requestsInteger120Requests per IP per window
global-per-ip.windowDuration1mWindow duration
global-per-ip.enabledBooleantrueEnable global rate limit
per-session.requestsInteger60Requests per session per window
per-session.windowDuration1mWindow duration
per-session.enabledBooleantrueEnable per-session rate limit
auth-endpoint.requestsInteger5Auth requests per window
auth-endpoint.windowDuration1mWindow duration
auth-endpoint.enabledBooleantrueEnable auth rate limit
cleanup-intervalDuration5mExpired entry cleanup interval

security.conn-limit

KeyTypeDefaultDescription
max-globalInteger1000Max concurrent connections (0 = unlimited)
max-per-ipInteger50Max concurrent connections per IP (0 = unlimited)

security.headers

KeyTypeDefaultDescription
hsts-enabledBooleanfalseEnable HSTS header
hsts-max-ageInteger31536000HSTS max-age in seconds
csp-policyStringdefault-src 'self'; ...Content Security Policy
frame-optionsStringDENYX-Frame-Options value
referrer-policyStringstrict-origin-when-cross-originReferrer-Policy value

security.body-limit

KeyTypeDefaultDescription
max-body-sizeInteger1048576Maximum request body size in bytes (1 MB)

security.audit

KeyTypeDefaultDescription
buffer-sizeInteger1024Audit log async buffer size

Port Summary

ServiceDefault PortDescription
MCP + REST API9000Main server (/mcp, /api/v1/*)
Portal9090Web UI for users and admins
Proxy9001MCP development proxy
Notification Service9004Standalone notification delivery