Channels
Channels
channels.graphql
Section titled “channels.graphql”GraphQL API channel configuration
The GraphQL channel exposes directory operations via GraphQL with:
- Collection queries: users(filter: …) { nodes { … } }
- Single lookup: user(id: ”…”) { … }
- Schema introspection: GET /graphql.sdl, GET /graphql.json
- GraphiQL UI: GET /graphql (Accept: text/html)
The base path is fixed at /graphql.
channels.graphql.apq
Section titled “channels.graphql.apq”Automatic Persisted Queries (APQ)
APQ reduces bandwidth by allowing clients to send SHA256 hashes instead of full query strings after initial registration. Flow:
- Client sends POST with query + hash (registers query in cache)
- Subsequent requests send only the hash (GET or POST)
- On cache miss, client retries with full query
channels.graphql.apq.enabled
Section titled “channels.graphql.apq.enabled”Enable APQ support
auto = enabled when GraphQL channel is enabledtrue = always enabled, false = always disabledPriority: SCRIBE_GRAPHQL_APQ_ENABLED > config
| Property | Value |
|---|---|
| Default | "auto" |
| Override | SCRIBE_GRAPHQL_APQ_ENABLED (optional) |
channels.graphql.apq.enabled = "auto"channels.graphql.apq.enabled = ${?SCRIBE_GRAPHQL_APQ_ENABLED}channels.graphql.apq.max-size
Section titled “channels.graphql.apq.max-size”Maximum number of cached queries (LRU eviction when exceeded)
Priority: SCRIBE_GRAPHQL_APQ_MAX_SIZE > config
| Property | Value |
|---|---|
| Default | 1000 |
| Override | SCRIBE_GRAPHQL_APQ_MAX_SIZE (optional) |
channels.graphql.apq.max-size = 1000channels.graphql.apq.max-size = ${?SCRIBE_GRAPHQL_APQ_MAX_SIZE}channels.graphql.apq.ttl
Section titled “channels.graphql.apq.ttl”Cache entry TTL (expireAfterAccess, keeps hot queries longer)
Priority: SCRIBE_GRAPHQL_APQ_TTL > config
| Property | Value |
|---|---|
| Default | 10h |
| Override | SCRIBE_GRAPHQL_APQ_TTL (optional) |
channels.graphql.apq.ttl = 10hchannels.graphql.apq.ttl = ${?SCRIBE_GRAPHQL_APQ_TTL}channels.graphql.auth
Section titled “channels.graphql.auth”Authentication settings for GraphQL API.
Inherits from root auth {} and can override settings.
channels.graphql.auth.enabled
Section titled “channels.graphql.auth.enabled”| Property | Value |
|---|---|
| Override | SCRIBE_GRAPHQL_AUTH_ENABLED (optional) |
channels.graphql.auth.enabled = ${?SCRIBE_GRAPHQL_AUTH_ENABLED}channels.graphql.auth.methods
Section titled “channels.graphql.auth.methods”Override global auth.methods with channel-specific list
Priority: SCRIBE_GRAPHQL_AUTH_METHODS > config > auth.methods
| Property | Value |
|---|---|
| Override | SCRIBE_GRAPHQL_AUTH_METHODS (optional) |
channels.graphql.auth.methods = ${?SCRIBE_GRAPHQL_AUTH_METHODS}channels.graphql.default-limit
Section titled “channels.graphql.default-limit”Query Parameter Defaults
Applied when the client omits the parameter. Client-provided values override these defaults except for max-limit which always caps. Default page size when no limit/first/last specified (configurable, default: 25)
Priority: SCRIBE_GRAPHQL_DEFAULT_LIMIT > config
| Property | Value |
|---|---|
| Default | 25 |
| Override | SCRIBE_GRAPHQL_DEFAULT_LIMIT (optional) |
channels.graphql.default-limit = 25channels.graphql.default-limit = ${?SCRIBE_GRAPHQL_DEFAULT_LIMIT}channels.graphql.enabled
Section titled “channels.graphql.enabled”Enable the GraphQL channel
Priority: SCRIBE_GRAPHQL_ENABLED > config
| Property | Value |
|---|---|
| Default | false |
| Override | SCRIBE_GRAPHQL_ENABLED (optional) |
channels.graphql.enabled = falsechannels.graphql.enabled = ${?SCRIBE_GRAPHQL_ENABLED}channels.graphql.introspection
Section titled “channels.graphql.introspection”Schema Introspection
Controls access to schema introspection and SDL endpoints. Disable in production to reduce attack surface.
When disabled:
- Schema endpoints return 404: /graphql.json, /graphql.sdl
- Introspection queries are blocked: { __schema { … } }
channels.graphql.introspection.enabled
Section titled “channels.graphql.introspection.enabled”Enable schema introspection
auto = enabled in dev/test, disabled in prod (security-safe default)Affects: GET /graphql.json, GET /graphql.sdl, and introspection queries
Priority: SCRIBE_GRAPHQL_INTROSPECTION_ENABLED > config
| Property | Value |
|---|---|
| Default | "auto" |
| Override | SCRIBE_GRAPHQL_INTROSPECTION_ENABLED (optional) |
channels.graphql.introspection.enabled = "auto"channels.graphql.introspection.enabled = ${?SCRIBE_GRAPHQL_INTROSPECTION_ENABLED}channels.graphql.limits
Section titled “channels.graphql.limits”Query analysis limits (applied after parsing, before execution). These prevent queries that would consume excessive resources.
channels.graphql.limits.max-complexity
Section titled “channels.graphql.limits.max-complexity”Maximum query complexity (prevents wide queries with many fields). Complexity is calculated as sum of fields selected. Set to 0 to disable. Tune based on staging logs (start with p95 + headroom).
Priority: SCRIBE_GRAPHQL_LIMITS_MAX_COMPLEXITY > config
| Property | Value |
|---|---|
| Default | 500 |
| Override | SCRIBE_GRAPHQL_LIMITS_MAX_COMPLEXITY (optional) |
channels.graphql.limits.max-complexity = 500channels.graphql.limits.max-complexity = ${?SCRIBE_GRAPHQL_LIMITS_MAX_COMPLEXITY}channels.graphql.limits.max-depth
Section titled “channels.graphql.limits.max-depth”Maximum query depth (prevents deeply nested queries). Default 15 allows introspection queries (required by GraphiQL). Set to 0 to disable depth checking.
Priority: SCRIBE_GRAPHQL_LIMITS_MAX_DEPTH > config
| Property | Value |
|---|---|
| Default | 15 |
| Override | SCRIBE_GRAPHQL_LIMITS_MAX_DEPTH (optional) |
channels.graphql.limits.max-depth = 15channels.graphql.limits.max-depth = ${?SCRIBE_GRAPHQL_LIMITS_MAX_DEPTH}channels.graphql.max-limit
Section titled “channels.graphql.max-limit”Maximum entries per request (caps client-provided limit, configurable, default: 1000)
Priority: SCRIBE_GRAPHQL_MAX_LIMIT > config
| Property | Value |
|---|---|
| Default | 1000 |
| Override | SCRIBE_GRAPHQL_MAX_LIMIT (optional) |
channels.graphql.max-limit = 1000channels.graphql.max-limit = ${?SCRIBE_GRAPHQL_MAX_LIMIT}channels.graphql.parser
Section titled “channels.graphql.parser”Query Security Limits
Protection against denial-of-service through excessive query complexity. These limits apply at different stages of query processing. Parser-level DoS limits (applied before query analysis). These are the first line of defense against malicious payloads.
channels.graphql.parser.max-characters
Section titled “channels.graphql.parser.max-characters”Maximum query characters (prevents excessive parsing time/memory).
Priority: SCRIBE_GRAPHQL_PARSER_MAX_CHARACTERS > config
| Property | Value |
|---|---|
| Default | 1048576 |
| Override | SCRIBE_GRAPHQL_PARSER_MAX_CHARACTERS (optional) |
channels.graphql.parser.max-characters = 1048576channels.graphql.parser.max-characters = ${?SCRIBE_GRAPHQL_PARSER_MAX_CHARACTERS}channels.graphql.parser.max-tokens
Section titled “channels.graphql.parser.max-tokens”Maximum query tokens (prevents parser CPU exhaustion).
Priority: SCRIBE_GRAPHQL_PARSER_MAX_TOKENS > config
| Property | Value |
|---|---|
| Default | 15000 |
| Override | SCRIBE_GRAPHQL_PARSER_MAX_TOKENS (optional) |
channels.graphql.parser.max-tokens = 15000channels.graphql.parser.max-tokens = ${?SCRIBE_GRAPHQL_PARSER_MAX_TOKENS}channels.graphql.signals
Section titled “channels.graphql.signals”Per-channel signal thresholds.
| Property | Value |
|---|---|
| Default | ${monitoring.signals} {} |
Inherits from: monitoring.signals
channels.graphql.signals = ${monitoring.signals} {}channels.graphql.socket
Section titled “channels.graphql.socket”Socket reference for GraphQL API.
Use a named socket from http.sockets.* or omit for @default.
Priority: SCRIBE_GRAPHQL_SOCKET > config
| Property | Value |
|---|---|
| Override | SCRIBE_GRAPHQL_SOCKET (optional) |
channels.graphql.socket = ${?SCRIBE_GRAPHQL_SOCKET}channels.graphql.ui
Section titled “channels.graphql.ui”GraphiQL UI configuration
GraphiQL v5 provides an interactive GraphQL query builder with Monaco Editor and optional plugins (Explorer, History). Assets are bundled with the app by default (offline-safe, no external network). Use asset {} block to override with CDN URLs.
channels.graphql.ui.asset
Section titled “channels.graphql.ui.asset”External asset configuration (CDN override). By default, GraphiQL assets are bundled with the app. If configured, all fields are required. SRI (Subresource Integrity) hash prevents supply-chain attacks.
channels.graphql.ui.asset.css-sri
Section titled “channels.graphql.ui.asset.css-sri”Subresource Integrity hash for the CSS stylesheet.
Example: "sha512-..."
| Property | Value |
|---|---|
| Default | null |
channels.graphql.ui.asset.css-sri = nullchannels.graphql.ui.asset.css-url
Section titled “channels.graphql.ui.asset.css-url”CDN URL for GraphiQL CSS stylesheet.
Example: "https://cdn.example.com/graphiql/5.2.0/graphiql.css"
| Property | Value |
|---|---|
| Default | null |
channels.graphql.ui.asset.css-url = nullchannels.graphql.ui.asset.js-sri
Section titled “channels.graphql.ui.asset.js-sri”Subresource Integrity hash for the JavaScript bundle.
Example: "sha512-..."
| Property | Value |
|---|---|
| Default | null |
channels.graphql.ui.asset.js-sri = nullchannels.graphql.ui.asset.js-url
Section titled “channels.graphql.ui.asset.js-url”CDN URL for GraphiQL JavaScript bundle.
Example: "https://cdn.example.com/graphiql/5.2.0/graphiql.bundle.js"
| Property | Value |
|---|---|
| Default | null |
channels.graphql.ui.asset.js-url = nullchannels.graphql.ui.dark-mode
Section titled “channels.graphql.ui.dark-mode”Dark mode (Monaco editor theme)
Priority: SCRIBE_GRAPHQL_UI_DARK_MODE > config
| Property | Value |
|---|---|
| Default | false |
| Override | SCRIBE_GRAPHQL_UI_DARK_MODE (optional) |
channels.graphql.ui.dark-mode = falsechannels.graphql.ui.dark-mode = ${?SCRIBE_GRAPHQL_UI_DARK_MODE}channels.graphql.ui.default-editor-tools-visibility
Section titled “channels.graphql.ui.default-editor-tools-visibility”Show variables/headers panel by default
auto = show in dev, hide in prodtrue = always show, false = always hidePriority: SCRIBE_GRAPHQL_UI_EDITOR_TOOLS > config
| Property | Value |
|---|---|
| Default | "auto" |
| Override | SCRIBE_GRAPHQL_UI_EDITOR_TOOLS (optional) |
channels.graphql.ui.default-editor-tools-visibility = "auto"channels.graphql.ui.default-editor-tools-visibility = ${?SCRIBE_GRAPHQL_UI_EDITOR_TOOLS}channels.graphql.ui.enabled
Section titled “channels.graphql.ui.enabled”Enable GraphiQL UI
auto = enabled in dev/test, disabled in prod (prod-safe default)Priority: SCRIBE_GRAPHQL_UI_ENABLED > config
| Property | Value |
|---|---|
| Default | "auto" |
| Override | SCRIBE_GRAPHQL_UI_ENABLED (optional) |
channels.graphql.ui.enabled = "auto"channels.graphql.ui.enabled = ${?SCRIBE_GRAPHQL_UI_ENABLED}channels.graphql.ui.plugins
Section titled “channels.graphql.ui.plugins”Plugins configuration
channels.graphql.ui.plugins.explorer
Section titled “channels.graphql.ui.plugins.explorer”Enable Explorer plugin (visual query builder) Great for non-developers to explore schema visually
Priority: SCRIBE_GRAPHQL_UI_EXPLORER > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_GRAPHQL_UI_EXPLORER (optional) |
channels.graphql.ui.plugins.explorer = truechannels.graphql.ui.plugins.explorer = ${?SCRIBE_GRAPHQL_UI_EXPLORER}channels.graphql.ui.plugins.history
Section titled “channels.graphql.ui.plugins.history”Enable History plugin (query history sidebar)
Priority: SCRIBE_GRAPHQL_UI_HISTORY > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_GRAPHQL_UI_HISTORY (optional) |
channels.graphql.ui.plugins.history = truechannels.graphql.ui.plugins.history = ${?SCRIBE_GRAPHQL_UI_HISTORY}channels.graphql.ui.show-examples
Section titled “channels.graphql.ui.show-examples”Show example queries and fragments When enabled, GraphiQL is pre-configured with:
- Per-type tabs with search, lookup, and changes queries
- Common fragments: {Type}Fields, ChangeDataFields, PageInfoFields
- FleX filter syntax examples
Priority: SCRIBE_GRAPHQL_UI_SHOW_EXAMPLES > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_GRAPHQL_UI_SHOW_EXAMPLES (optional) |
channels.graphql.ui.show-examples = truechannels.graphql.ui.show-examples = ${?SCRIBE_GRAPHQL_UI_SHOW_EXAMPLES}channels.ldap
Section titled “channels.ldap”LDAP channel configuration
The LDAP channel exposes directory operations via LDAP v3 protocol with:
- Standard LDAP search, compare, and bind operations
- Simple Paged Results and VLV controls for pagination
- Server-Side Sorting (SSS) control
- LDAPS (TLS) for secure connections
- Client certificate authentication
Settings inherit from the shared ldap configuration block.
channels.ldap.auth
Section titled “channels.ldap.auth”Authentication settings for LDAP channel.
Inherits from root auth {} and can override settings.
channels.ldap.auth.enabled
Section titled “channels.ldap.auth.enabled”| Property | Value |
|---|---|
| Override | SCRIBE_LDAP_AUTH_ENABLED (optional) |
channels.ldap.auth.enabled = ${?SCRIBE_LDAP_AUTH_ENABLED}channels.ldap.auth.methods
Section titled “channels.ldap.auth.methods”Override global auth.methods with channel-specific list
Priority: SCRIBE_LDAP_AUTH_METHODS > config > auth.methods
| Property | Value |
|---|---|
| Override | SCRIBE_LDAP_AUTH_METHODS (optional) |
channels.ldap.auth.methods = ${?SCRIBE_LDAP_AUTH_METHODS}channels.ldap.connection-hints
Section titled “channels.ldap.connection-hints”Connection Hints (channel-specific overrides)
Override database.connection-hints defaults for LDAP queries only. Values here are merged with database defaults (channel values win).
channels.ldap.connection-hints.lock-timeout
Section titled “channels.ldap.connection-hints.lock-timeout”Lock acquisition timeout
Priority: SCRIBE_LDAP_LOCK_TIMEOUT > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_LDAP_LOCK_TIMEOUT (optional) |
channels.ldap.connection-hints.lock-timeout = ${?SCRIBE_LDAP_LOCK_TIMEOUT}channels.ldap.connection-hints.session-flags
Section titled “channels.ldap.connection-hints.session-flags”Session flags (comma-separated): force-custom-plan, jit-off
Priority: SCRIBE_LDAP_SESSION_FLAGS > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_LDAP_SESSION_FLAGS (optional) |
channels.ldap.connection-hints.session-flags = ${?SCRIBE_LDAP_SESSION_FLAGS}channels.ldap.connection-hints.statement-timeout
Section titled “channels.ldap.connection-hints.statement-timeout”Statement execution timeout (prevents runaway queries)
Priority: SCRIBE_LDAP_STATEMENT_TIMEOUT > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_LDAP_STATEMENT_TIMEOUT (optional) |
channels.ldap.connection-hints.statement-timeout = ${?SCRIBE_LDAP_STATEMENT_TIMEOUT}channels.ldap.connection-hints.work-mem
Section titled “channels.ldap.connection-hints.work-mem”PostgreSQL work_mem per-query memory
Priority: SCRIBE_LDAP_WORK_MEM > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_LDAP_WORK_MEM (optional) |
channels.ldap.connection-hints.work-mem = ${?SCRIBE_LDAP_WORK_MEM}channels.ldap.linger-timeout-seconds
Section titled “channels.ldap.linger-timeout-seconds”Specifies the timeout in seconds that should be used if the SO_LINGER socket option is enabled. The value must be between 0 and 65535, inclusive.
Priority: SCRIBE_LDAP_LINGER_TIMEOUT_SECONDS > config
| Property | Value |
|---|---|
| Default | 5 |
| Override | SCRIBE_LDAP_LINGER_TIMEOUT_SECONDS (optional) |
channels.ldap.linger-timeout-seconds = ${?SCRIBE_LDAP_LINGER_TIMEOUT_SECONDS}channels.ldap.listen.item.host
Section titled “channels.ldap.listen.item.host”Specifies the address on which to listen for client connections. The provided value must be a valid IP address or hostname. It may be null to indicate that it should listen on all available addresses on all interfaces.
| Property | Value |
|---|---|
| Default | null |
channels.ldap.listen.item.host = nullchannels.ldap.listen.item.port
Section titled “channels.ldap.listen.item.port”Specifies the port number on which to listen for client connections. The provided value must be between 1 and 65535, or it may be 0 to indicate that the JVM should select a free port on the system.
| Property | Value |
|---|---|
| Default | 10389 |
channels.ldap.listen.item.port = 10389channels.ldap.listen.item.ssl
Section titled “channels.ldap.listen.item.ssl”Enable SSL/TLS for the listener. Presence of this block enables LDAPS. Inherits from the shared ssl configuration (ssl.ca, ssl.cert, ssl.key, ssl.password).
channels.ldap.listen.item.ssl.request-client-certificate
Section titled “channels.ldap.listen.item.ssl.request-client-certificate”Specifies whether the server should request that the client present its own certificate chain during TLS negotiation. This will be ignored for non-TLS-based connections.
| Property | Value |
|---|---|
| Default | false |
channels.ldap.listen.item.ssl.request-client-certificate = falsechannels.ldap.listen.item.ssl.require-client-certificate
Section titled “channels.ldap.listen.item.ssl.require-client-certificate”Indicates whether the server should require that the client present its own certificate chain during TLS negotiation and should fail negotiation if no certificate chain was provided. This will be ignored for non-TLS-based connections, and it will also be ignored if request-client-certificate is false.
| Property | Value |
|---|---|
| Default | false |
channels.ldap.listen.item.ssl.require-client-certificate = falsechannels.ldap.max-connections
Section titled “channels.ldap.max-connections”Connection Limits
Configure limits on connections and message sizes. Specifies the maximum number of concurrent connections that the server will allow. If a client tries to establish a new connection while the server already has the maximum number of concurrent connections, then the new connection will be rejected. A value that is less than or equal to zero indicates no limit.
Priority: SCRIBE_LDAP_MAX_CONNECTIONS > config
| Property | Value |
|---|---|
| Default | 0 |
| Override | SCRIBE_LDAP_MAX_CONNECTIONS (optional) |
channels.ldap.max-connections = ${?SCRIBE_LDAP_MAX_CONNECTIONS}channels.ldap.max-message-size-bytes
Section titled “channels.ldap.max-message-size-bytes”Specifies the maximum size in bytes for LDAP messages that will be accepted by this server. A value that is less than or equal to zero will use the maximum allowed message size.
Priority: SCRIBE_LDAP_MAX_MESSAGE_SIZE_BYTES > config
| Property | Value |
|---|---|
| Default | 0 |
| Override | SCRIBE_LDAP_MAX_MESSAGE_SIZE_BYTES (optional) |
channels.ldap.max-message-size-bytes = ${?SCRIBE_LDAP_MAX_MESSAGE_SIZE_BYTES}channels.ldap.prevent-delegation
Section titled “channels.ldap.prevent-delegation”Prevent delegation to backend LDAP server When true, requests that cannot be satisfied locally will fail with UNWILLING_TO_PERFORM instead of delegating to the upstream LDAP server. Use for strict isolation only - enabling this may break schema queries, directory browser operations, and other features that require backend access.
Default: false (delegation allowed)
| Property | Value |
|---|---|
| Default | false |
| Override | SCRIBE_LDAP_PREVENT_DELEGATION (optional) |
channels.ldap.prevent-delegation = falsechannels.ldap.prevent-delegation = ${?SCRIBE_LDAP_PREVENT_DELEGATION}channels.ldap.receive-buffer-size
Section titled “channels.ldap.receive-buffer-size”Buffer Sizes
Configure socket buffer sizes for performance tuning. Specifies the receive buffer size that should be used for sockets accepted by the server. A value less than or equal to zero indicates that the default receive buffer size should be used.
Priority: SCRIBE_LDAP_RECEIVE_BUFFER_SIZE > config
| Property | Value |
|---|---|
| Default | 0 |
| Override | SCRIBE_LDAP_RECEIVE_BUFFER_SIZE (optional) |
channels.ldap.receive-buffer-size = ${?SCRIBE_LDAP_RECEIVE_BUFFER_SIZE}channels.ldap.send-buffer-size
Section titled “channels.ldap.send-buffer-size”Specifies the send buffer size that should be used for sockets accepted by the listener. A value less than or equal to zero indicates that the default send buffer size should be used.
Priority: SCRIBE_LDAP_SEND_BUFFER_SIZE > config
| Property | Value |
|---|---|
| Default | 0 |
| Override | SCRIBE_LDAP_SEND_BUFFER_SIZE (optional) |
channels.ldap.send-buffer-size = ${?SCRIBE_LDAP_SEND_BUFFER_SIZE}channels.ldap.signals
Section titled “channels.ldap.signals”Per-channel signal thresholds.
LDAP typically has tighter latency requirements.
Example: Stricter LDAP latency thresholds
signals = ${monitoring.signals} { latency-p99 { degraded = 0.3, critical = 1.0 } }
| Property | Value |
|---|---|
| Default | ${monitoring.signals} {} |
Inherits from: monitoring.signals
channels.ldap.signals = ${monitoring.signals} {}channels.ldap.tcp-no-delay
Section titled “channels.ldap.tcp-no-delay”Indicates whether to use the TCP_NODELAY socket option for sockets accepted by the server. When enabled, disables Nagle’s algorithm for lower latency at the cost of more packets.
Priority: SCRIBE_LDAP_TCP_NO_DELAY > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_LDAP_TCP_NO_DELAY (optional) |
channels.ldap.tcp-no-delay = ${?SCRIBE_LDAP_TCP_NO_DELAY}channels.ldap.use-keep-alive
Section titled “channels.ldap.use-keep-alive”Socket Options
Fine-tune TCP connection behavior for LDAP connections. Specifies whether to use the SO_KEEPALIVE socket option for sockets accepted by the server. When enabled, the system will periodically probe idle connections to detect broken connections.
Priority: SCRIBE_LDAP_USE_KEEP_ALIVE > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_LDAP_USE_KEEP_ALIVE (optional) |
channels.ldap.use-keep-alive = ${?SCRIBE_LDAP_USE_KEEP_ALIVE}channels.ldap.use-linger
Section titled “channels.ldap.use-linger”Specifies whether to use the SO_LINGER socket option for sockets accepted by the server. When enabled, the socket will wait for pending data to be sent before closing.
Priority: SCRIBE_LDAP_USE_LINGER > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_LDAP_USE_LINGER (optional) |
channels.ldap.use-linger = ${?SCRIBE_LDAP_USE_LINGER}channels.ldap.use-reuse-address
Section titled “channels.ldap.use-reuse-address”Specifies whether to use the SO_REUSEADDR socket option for sockets accepted by the server. When enabled, allows the socket to bind to an address that is already in use.
Priority: SCRIBE_LDAP_USE_REUSE_ADDRESS > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_LDAP_USE_REUSE_ADDRESS (optional) |
channels.ldap.use-reuse-address = ${?SCRIBE_LDAP_USE_REUSE_ADDRESS}channels.mcp
Section titled “channels.mcp”MCP (Model Context Protocol) channel configuration
The MCP channel exposes directory operations to AI coding assistants via:
- Tools: describe, search, help, ref
- Prompts: usage guide, filter syntax, troubleshooting
- Resources: OpenAPI spec, GraphQL schema, reference index
Works with Cursor, Claude Desktop, VS Code, Windsurf, and other MCP clients. The endpoint is fixed at /mcp. IMPORTANT: MCP requires HTTP/1.1 for Server-Sent Events (SSE) transport. HTTP/2-only sockets will not work. Ensure the bound socket has HTTP/1.1 enabled:
http.protocols.http-1-1.enabled = true (default)channels.mcp.auth
Section titled “channels.mcp.auth”Authentication settings for MCP channel.
MCP clients discover auth via /.well-known/oauth-authorization-server (RFC 8414). Inherits from root auth {} and can override settings.
channels.mcp.auth.enabled
Section titled “channels.mcp.auth.enabled”| Property | Value |
|---|---|
| Override | SCRIBE_MCP_AUTH_ENABLED (optional) |
channels.mcp.auth.enabled = ${?SCRIBE_MCP_AUTH_ENABLED}channels.mcp.auth.methods
Section titled “channels.mcp.auth.methods”Override global auth.methods with channel-specific list
Priority: SCRIBE_MCP_AUTH_METHODS > config > auth.methods
| Property | Value |
|---|---|
| Override | SCRIBE_MCP_AUTH_METHODS (optional) |
channels.mcp.auth.methods = ${?SCRIBE_MCP_AUTH_METHODS}channels.mcp.default-limit
Section titled “channels.mcp.default-limit”Query Parameter Defaults
Applied when the client omits the parameter. Default page size for search results (configurable, default: 25)
Priority: SCRIBE_MCP_DEFAULT_LIMIT > config
| Property | Value |
|---|---|
| Default | 25 |
| Override | SCRIBE_MCP_DEFAULT_LIMIT (optional) |
channels.mcp.default-limit = 25channels.mcp.default-limit = ${?SCRIBE_MCP_DEFAULT_LIMIT}channels.mcp.enabled
Section titled “channels.mcp.enabled”Enable the MCP channel
Priority: SCRIBE_MCP_ENABLED > config
| Property | Value |
|---|---|
| Default | false |
| Override | SCRIBE_MCP_ENABLED (optional) |
channels.mcp.enabled = falsechannels.mcp.enabled = ${?SCRIBE_MCP_ENABLED}channels.mcp.max-limit
Section titled “channels.mcp.max-limit”Maximum entries per search request (caps client-provided limit, default: 100)
Priority: SCRIBE_MCP_MAX_LIMIT > config
| Property | Value |
|---|---|
| Default | 100 |
| Override | SCRIBE_MCP_MAX_LIMIT (optional) |
channels.mcp.max-limit = 100channels.mcp.max-limit = ${?SCRIBE_MCP_MAX_LIMIT}channels.mcp.socket
Section titled “channels.mcp.socket”Socket reference(s) for MCP channel.
Can be a single name, comma-separated list, or HOCON list. Use named sockets from http.sockets.* or omit for @default.
Priority: SCRIBE_MCP_SOCKET > config
Examples:
socket = "admin" # Single socketsocket = "admin, public" # Comma-separatedsocket = ["admin", "public"] # HOCON list| Property | Value |
|---|---|
| Override | SCRIBE_MCP_SOCKET (optional) |
channels.mcp.socket = ${?SCRIBE_MCP_SOCKET}channels.rest
Section titled “channels.rest”REST API channel configuration
The REST channel exposes directory operations via HTTP/JSON with:
- Collection search: GET /api/entries/{entry_type}
- Single lookup: GET /api/entries/{entry_type}/{id}
- OpenAPI UI/spec: GET /api
The base path is fixed at /api. Customers needing a different external path can use a reverse proxy for path rewriting.
channels.rest.auth
Section titled “channels.rest.auth”Authentication settings for REST API.
Inherits from root auth {} and can override settings.
channels.rest.auth.enabled
Section titled “channels.rest.auth.enabled”| Property | Value |
|---|---|
| Override | SCRIBE_REST_AUTH_ENABLED (optional) |
channels.rest.auth.enabled = ${?SCRIBE_REST_AUTH_ENABLED}channels.rest.auth.methods
Section titled “channels.rest.auth.methods”Override global auth.methods with channel-specific list
Priority: SCRIBE_REST_AUTH_METHODS > config > auth.methods
| Property | Value |
|---|---|
| Override | SCRIBE_REST_AUTH_METHODS (optional) |
channels.rest.auth.methods = ${?SCRIBE_REST_AUTH_METHODS}channels.rest.connection-hints
Section titled “channels.rest.connection-hints”Connection Hints (channel-specific overrides)
Override database.connection-hints defaults for REST queries only. Values here are merged with database defaults (channel values win).
channels.rest.connection-hints.lock-timeout
Section titled “channels.rest.connection-hints.lock-timeout”Lock acquisition timeout
Priority: SCRIBE_REST_LOCK_TIMEOUT > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_REST_LOCK_TIMEOUT (optional) |
channels.rest.connection-hints.lock-timeout = ${?SCRIBE_REST_LOCK_TIMEOUT}channels.rest.connection-hints.session-flags
Section titled “channels.rest.connection-hints.session-flags”Session flags (comma-separated): force-custom-plan, jit-off
Priority: SCRIBE_REST_SESSION_FLAGS > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_REST_SESSION_FLAGS (optional) |
channels.rest.connection-hints.session-flags = ${?SCRIBE_REST_SESSION_FLAGS}channels.rest.connection-hints.statement-timeout
Section titled “channels.rest.connection-hints.statement-timeout”Statement execution timeout (prevents runaway queries)
Priority: SCRIBE_REST_STATEMENT_TIMEOUT > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_REST_STATEMENT_TIMEOUT (optional) |
channels.rest.connection-hints.statement-timeout = ${?SCRIBE_REST_STATEMENT_TIMEOUT}channels.rest.connection-hints.work-mem
Section titled “channels.rest.connection-hints.work-mem”PostgreSQL work_mem per-query memory
Priority: SCRIBE_REST_WORK_MEM > config > database.connection-hints
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_REST_WORK_MEM (optional) |
channels.rest.connection-hints.work-mem = ${?SCRIBE_REST_WORK_MEM}channels.rest.default-count
Section titled “channels.rest.default-count”Default count mode: exact, estimated, none (configurable, default: “estimated”)
Priority: SCRIBE_REST_DEFAULT_COUNT > config
| Property | Value |
|---|---|
| Default | "estimated" |
| Override | SCRIBE_REST_DEFAULT_COUNT (optional) |
channels.rest.default-count = "estimated"channels.rest.default-count = ${?SCRIBE_REST_DEFAULT_COUNT}channels.rest.default-fields
Section titled “channels.rest.default-fields”Default attribute selection (configurable)
- null (default): return all user attributes (equivalent to LDAP ”*”)
- “cn,mail,sn”: return only specified attributes
- ”*,+”: return all user and operational attributes
Priority: SCRIBE_REST_DEFAULT_FIELDS > config
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_REST_DEFAULT_FIELDS (optional) |
channels.rest.default-fields = ${?SCRIBE_REST_DEFAULT_FIELDS}channels.rest.default-include
Section titled “channels.rest.default-include”Default response shape: nodes, edges, pageInfo, count (comma-separated)
Configurable, default: “nodes,pageInfo,count”
Priority: SCRIBE_REST_DEFAULT_INCLUDE > config
| Property | Value |
|---|---|
| Default | "nodes,pageInfo,count" |
| Override | SCRIBE_REST_DEFAULT_INCLUDE (optional) |
channels.rest.default-include = "nodes,pageInfo,count"channels.rest.default-include = ${?SCRIBE_REST_DEFAULT_INCLUDE}channels.rest.default-limit
Section titled “channels.rest.default-limit”Query Parameter Defaults
Applied when the client omits the parameter. Client-provided values override these defaults except for max-limit which always caps. Default page size when no limit/first/last specified (configurable, default: 25)
Priority: SCRIBE_REST_DEFAULT_LIMIT > config
| Property | Value |
|---|---|
| Default | 25 |
| Override | SCRIBE_REST_DEFAULT_LIMIT (optional) |
channels.rest.default-limit = 25channels.rest.default-limit = ${?SCRIBE_REST_DEFAULT_LIMIT}channels.rest.default-sort
Section titled “channels.rest.default-sort”Default sort order (configurable)
- null (default): database-native order (typically insertion order, not guaranteed stable)
- “cn”: sort by cn ascending
- “-modifyTimestamp,cn”: sort by modifyTimestamp descending, then cn ascending
Priority: SCRIBE_REST_DEFAULT_SORT > config
| Property | Value |
|---|---|
| Default | null |
| Override | SCRIBE_REST_DEFAULT_SORT (optional) |
channels.rest.default-sort = ${?SCRIBE_REST_DEFAULT_SORT}channels.rest.enabled
Section titled “channels.rest.enabled”Enable the REST channel
Priority: SCRIBE_REST_ENABLED > config
| Property | Value |
|---|---|
| Default | false |
| Override | SCRIBE_REST_ENABLED (optional) |
channels.rest.enabled = falsechannels.rest.enabled = ${?SCRIBE_REST_ENABLED}channels.rest.export
Section titled “channels.rest.export”Export Configuration
Streaming export for search results in various formats (CSV, TSV, LDIF, JSON, etc.) Triggered by filename or export query parameter on search endpoints.
channels.rest.export.connection-hints
Section titled “channels.rest.export.connection-hints”Connection hints for export queries (read-replica routing, longer timeout)
channels.rest.export.connection-hints.read-only
Section titled “channels.rest.export.connection-hints.read-only”| Property | Value |
|---|---|
| Default | true |
channels.rest.export.connection-hints.read-only = truechannels.rest.export.connection-hints.statement-timeout
Section titled “channels.rest.export.connection-hints.statement-timeout”| Property | Value |
|---|---|
| Default | 5m |
channels.rest.export.connection-hints.statement-timeout = 5mchannels.rest.export.default-format
Section titled “channels.rest.export.default-format”Default format when Accept is / and filename has no extension Options: csv, tsv, ldif, json, ndjson, json-seq, json-ld
Priority: SCRIBE_REST_EXPORT_DEFAULT_FORMAT > config
| Property | Value |
|---|---|
| Default | "ndjson" |
| Override | SCRIBE_REST_EXPORT_DEFAULT_FORMAT (optional) |
channels.rest.export.default-format = "ndjson"channels.rest.export.default-format = ${?SCRIBE_REST_EXPORT_DEFAULT_FORMAT}channels.rest.export.enabled
Section titled “channels.rest.export.enabled”Enable export functionality
Priority: SCRIBE_REST_EXPORT_ENABLED > config
| Property | Value |
|---|---|
| Default | true |
| Override | SCRIBE_REST_EXPORT_ENABLED (optional) |
channels.rest.export.enabled = truechannels.rest.export.enabled = ${?SCRIBE_REST_EXPORT_ENABLED}channels.rest.export.fetch-size
Section titled “channels.rest.export.fetch-size”DB fetch size (rows per round-trip)
Priority: SCRIBE_REST_EXPORT_FETCH_SIZE > config
| Property | Value |
|---|---|
| Default | 2000 |
| Override | SCRIBE_REST_EXPORT_FETCH_SIZE (optional) |
channels.rest.export.fetch-size = 2000channels.rest.export.fetch-size = ${?SCRIBE_REST_EXPORT_FETCH_SIZE}channels.rest.export.flush-batch-size
Section titled “channels.rest.export.flush-batch-size”Rows per flush (batch flush for performance)
Priority: SCRIBE_REST_EXPORT_FLUSH_BATCH_SIZE > config
| Property | Value |
|---|---|
| Default | 500 |
| Override | SCRIBE_REST_EXPORT_FLUSH_BATCH_SIZE (optional) |
channels.rest.export.flush-batch-size = 500channels.rest.export.flush-batch-size = ${?SCRIBE_REST_EXPORT_FLUSH_BATCH_SIZE}channels.rest.export.ldif
Section titled “channels.rest.export.ldif”LDIF Format Global Settings
These settings apply JVM-wide to all LDIF exports (UnboundID SDK limitation). Per-export options (wrapColumn, headerComment, version) are configured via the export query parameter JSON.
channels.rest.export.ldif.base64-strategy
Section titled “channels.rest.export.ldif.base64-strategy”Base64 encoding strategy for LDIF output Options:
- minimal-compliant: Encode only when required by RFC 2849 (default, most readable)
- default: Library default encoding
- maximal: Encode everything that could be encoded
- user-friendly: Non-compliant but more readable for non-ASCII
Priority: SCRIBE_LDIF_BASE64_STRATEGY > config
| Property | Value |
|---|---|
| Default | "minimal-compliant" |
| Override | SCRIBE_LDIF_BASE64_STRATEGY (optional) |
channels.rest.export.ldif.base64-strategy = "minimal-compliant"channels.rest.export.ldif.base64-strategy = ${?SCRIBE_LDIF_BASE64_STRATEGY}channels.rest.export.ldif.comment-about-base64
Section titled “channels.rest.export.ldif.comment-about-base64”Add comments explaining base64-encoded values Useful for debugging but makes output noisier and breaks clean diffs.
Priority: SCRIBE_LDIF_COMMENT_ABOUT_BASE64 > config
| Property | Value |
|---|---|
| Default | false |
| Override | SCRIBE_LDIF_COMMENT_ABOUT_BASE64 (optional) |
channels.rest.export.ldif.comment-about-base64 = falsechannels.rest.export.ldif.comment-about-base64 = ${?SCRIBE_LDIF_COMMENT_ABOUT_BASE64}channels.rest.export.max-duration
Section titled “channels.rest.export.max-duration”Maximum export duration (abort if exceeded)
Priority: SCRIBE_REST_EXPORT_MAX_DURATION > config
| Property | Value |
|---|---|
| Default | 5m |
| Override | SCRIBE_REST_EXPORT_MAX_DURATION (optional) |
channels.rest.export.max-duration = 5mchannels.rest.export.max-duration = ${?SCRIBE_REST_EXPORT_MAX_DURATION}channels.rest.export.max-rows
Section titled “channels.rest.export.max-rows”Maximum rows per export (hard cap, prevents runaway exports)
Priority: SCRIBE_REST_EXPORT_MAX_ROWS > config
| Property | Value |
|---|---|
| Default | 100000 |
| Override | SCRIBE_REST_EXPORT_MAX_ROWS (optional) |
channels.rest.export.max-rows = 100000channels.rest.export.max-rows = ${?SCRIBE_REST_EXPORT_MAX_ROWS}channels.rest.http
Section titled “channels.rest.http”HTTP server settings for REST API.
This section inherits all settings from http. Override individual settings as needed.
channels.rest.max-limit
Section titled “channels.rest.max-limit”Maximum entries per request (caps client-provided limit, configurable, default: 1000)
Priority: SCRIBE_REST_MAX_LIMIT > config
| Property | Value |
|---|---|
| Default | 1000 |
| Override | SCRIBE_REST_MAX_LIMIT (optional) |
channels.rest.max-limit = 1000channels.rest.max-limit = ${?SCRIBE_REST_MAX_LIMIT}channels.rest.openapi
Section titled “channels.rest.openapi”OpenAPI Schema Endpoints
Controls access to OpenAPI spec endpoints (JSON/YAML). Disable in production to reduce attack surface.
channels.rest.openapi.enabled
Section titled “channels.rest.openapi.enabled”Enable OpenAPI schema endpoints
auto = enabled in dev/test, disabled in prod (security-safe default)Affects: GET /api.json, GET /api.yaml, GET /openapi.json, GET /openapi.yaml
Priority: SCRIBE_REST_OPENAPI_ENABLED > config
| Property | Value |
|---|---|
| Default | "auto" |
| Override | SCRIBE_REST_OPENAPI_ENABLED (optional) |
channels.rest.openapi.enabled = "auto"channels.rest.openapi.enabled = ${?SCRIBE_REST_OPENAPI_ENABLED}channels.rest.signals
Section titled “channels.rest.signals”Per-channel signal thresholds.
Inherits from monitoring.signals, override what differs.
Example: REST API tolerates higher latency
signals = ${monitoring.signals} { latency-p99 { degraded = 1.0, critical = 3.0 } }
| Property | Value |
|---|---|
| Default | ${monitoring.signals} { } |
Inherits from: monitoring.signals
channels.rest.signals = ${monitoring.signals} { }channels.rest.socket
Section titled “channels.rest.socket”Socket for REST API endpoints.
Use a named socket from http.sockets.* or omit for @default. If unset (no env var, key omitted, or value is null), defaults to @default.
Priority: SCRIBE_REST_SOCKET > config
| Property | Value |
|---|---|
| Override | SCRIBE_REST_SOCKET (optional) |
channels.rest.socket = ${?SCRIBE_REST_SOCKET}channels.rest.ui
Section titled “channels.rest.ui”OpenAPI UI (Scalar API Reference) configuration
Inherits all defaults from openapi.ui. Channel-specific env vars can override individual settings. See openapi.ui in reference/openapi.conf for all available settings.
| Property | Value |
|---|---|
| Default | ${openapi.ui} |
Inherits from: openapi.ui
channels.rest.ui = ${openapi.ui}channels.rest.ui
Section titled “channels.rest.ui”OpenAPI UI (Scalar API Reference) configuration
Inherits all defaults from openapi.ui. Channel-specific env vars can override individual settings. See openapi.ui in reference/openapi.conf for all available settings.
channels.rest.ui.asset
Section titled “channels.rest.ui.asset”External asset (CDN override)
channels.rest.ui.asset.sri
Section titled “channels.rest.ui.asset.sri”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_ASSET_SRI (optional) |
channels.rest.ui.asset.sri = ${?SCRIBE_REST_UI_ASSET_SRI}channels.rest.ui.asset.url
Section titled “channels.rest.ui.asset.url”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_ASSET_URL (optional) |
channels.rest.ui.asset.url = ${?SCRIBE_REST_UI_ASSET_URL}channels.rest.ui.dark-mode
Section titled “channels.rest.ui.dark-mode”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_DARK_MODE (optional) |
channels.rest.ui.dark-mode = ${?SCRIBE_REST_UI_DARK_MODE}channels.rest.ui.enabled
Section titled “channels.rest.ui.enabled”Channel-specific env var overrides
Priority: SCRIBE_REST_UI_* > openapi.ui.*
| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_ENABLED (optional) |
channels.rest.ui.enabled = ${?SCRIBE_REST_UI_ENABLED}channels.rest.ui.force-dark-mode-state
Section titled “channels.rest.ui.force-dark-mode-state”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_FORCE_DARK_MODE_STATE (optional) |
channels.rest.ui.force-dark-mode-state = ${?SCRIBE_REST_UI_FORCE_DARK_MODE_STATE}channels.rest.ui.hide-dark-mode-toggle
Section titled “channels.rest.ui.hide-dark-mode-toggle”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_HIDE_DARK_MODE_TOGGLE (optional) |
channels.rest.ui.hide-dark-mode-toggle = ${?SCRIBE_REST_UI_HIDE_DARK_MODE_TOGGLE}channels.rest.ui.hide-test-request-button
Section titled “channels.rest.ui.hide-test-request-button”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_HIDE_TEST_REQUEST_BUTTON (optional) |
channels.rest.ui.hide-test-request-button = ${?SCRIBE_REST_UI_HIDE_TEST_REQUEST_BUTTON}channels.rest.ui.layout
Section titled “channels.rest.ui.layout”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_LAYOUT (optional) |
channels.rest.ui.layout = ${?SCRIBE_REST_UI_LAYOUT}channels.rest.ui.search-hot-key
Section titled “channels.rest.ui.search-hot-key”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_SEARCH_HOT_KEY (optional) |
channels.rest.ui.search-hot-key = ${?SCRIBE_REST_UI_SEARCH_HOT_KEY}channels.rest.ui.show-developer-tools
Section titled “channels.rest.ui.show-developer-tools”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_SHOW_DEVELOPER_TOOLS (optional) |
channels.rest.ui.show-developer-tools = ${?SCRIBE_REST_UI_SHOW_DEVELOPER_TOOLS}channels.rest.ui.show-sidebar
Section titled “channels.rest.ui.show-sidebar”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_SHOW_SIDEBAR (optional) |
channels.rest.ui.show-sidebar = ${?SCRIBE_REST_UI_SHOW_SIDEBAR}channels.rest.ui.theme
Section titled “channels.rest.ui.theme”| Property | Value |
|---|---|
| Override | SCRIBE_REST_UI_THEME (optional) |
channels.rest.ui.theme = ${?SCRIBE_REST_UI_THEME}