Skip to main content

Behavioral Modes

Behavioral modes control how ThoughtJack transmits responses (delivery behaviors) and what additional actions it takes (side effects). See TJ-SPEC-004 for the formal specification.

Delivery behaviors

Delivery behaviors modify the transport-level transmission of responses.

normal

Standard immediate delivery. No modification to response transmission.

behavior:
delivery:
type: normal

No additional parameters. This is the default when no behavior is configured.

slow_loris

Delivers the response in small chunks with a delay between each chunk.

behavior:
delivery:
type: slow_loris
byte_delay_ms: 100
chunk_size: 1
ParameterTypeDefaultDescription
byte_delay_msinteger100Delay between chunks in milliseconds
chunk_sizeinteger1Bytes per chunk

Transport: stdio, HTTP.

unbounded_line

Sends the response without a trailing newline, optionally padded to a target size.

behavior:
delivery:
type: unbounded_line
target_bytes: 65536
padding_char: " "
ParameterTypeDefaultDescription
target_bytesinteger65536Total message size with padding
padding_charstring" "Character used for padding

Transport: stdio, HTTP.

nested_json

Wraps the response in deeply nested JSON objects.

behavior:
delivery:
type: nested_json
depth: 1000
key: "data"
ParameterTypeDefaultDescription
depthinteger1000Nesting depth
keystring"data"Key name at each level

Transport: stdio, HTTP.

response_delay

Adds a fixed delay before sending the response.

behavior:
delivery:
type: response_delay
delay_ms: 5000
ParameterTypeDefaultDescription
delay_msinteger1000Delay in milliseconds

Transport: stdio, HTTP.

Side effects

Side effects are additional actions executed alongside or instead of normal responses.

notification_flood

Sends MCP notifications at a configurable rate.

behavior:
side_effects:
- type: notification_flood
rate_per_second: 100
duration_ms: 5000
trigger: on_request
ParameterTypeDefaultDescription
rate_per_secondinteger10Notifications per second
duration_msinteger5000Duration of the flood
triggerstringon_requestWhen to activate

Transport: stdio, HTTP.

batch_amplify

Sends oversized JSON-RPC notification batches.

behavior:
side_effects:
- type: batch_amplify
count: 1000
trigger: on_request
ParameterTypeDefaultDescription
countinteger100Notifications per batch
triggerstringon_requestWhen to activate

Transport: stdio, HTTP.

pipe_deadlock

Fills the stdout buffer without reading stdin, causing a bidirectional I/O deadlock.

behavior:
side_effects:
- type: pipe_deadlock
trigger: on_request
ParameterTypeDefaultDescription
triggerstringon_requestWhen to activate

Transport: stdio only. Silently skipped on HTTP.

close_connection

Forces the transport connection closed.

behavior:
side_effects:
- type: close_connection
graceful: false
trigger: on_request
ParameterTypeDefaultDescription
gracefulbooleantrueClean close (true) or abrupt (false)
triggerstringon_requestWhen to activate

Transport: stdio, HTTP.

duplicate_request_ids

Sends multiple responses with the same JSON-RPC request ID.

behavior:
side_effects:
- type: duplicate_request_ids
trigger: on_request
ParameterTypeDefaultDescription
triggerstringon_requestWhen to activate

Transport: stdio, HTTP.

Side effect triggers

TriggerWhen it fires
on_connectClient connects
on_requestEach incoming request (default)
on_subscribeClient subscribes to a resource
on_unsubscribeClient unsubscribes
continuousBackground loop

Behavior scoping

Behaviors resolve in priority order (highest first):

  1. Tool-level - per-tool behavior block
  2. Phase-level - phase behavior block
  3. Baseline-level - top-level behavior block
  4. Default - normal delivery, no side effects

The BehaviorCoordinator resolves the effective behavior by walking this chain.

Delivery result

Each delivery produces a DeliveryResult:

FieldTypeDescription
bytes_sentu64Total bytes transmitted
durationDurationTime taken for delivery
completedboolWhether delivery completed fully

Side effect outcome

Each side effect execution produces a SideEffectOutcome:

VariantDescription
CompletedSide effect ran to completion
CloseConnection { graceful }Connection should be closed

See also