Transport-level routing for MCP/ACP protocols
We appreciate your patience. The service is temporarily operating in an external runtime environment.
Transport-level routing for MCP/ACP protocols
We appreciate your patience. The service is temporarily operating in an external runtime environment.
Complete configuration reference for stdio Bus workers with examples and best practices.
stdio Bus kernel is configured via JSON files that specify worker pools, resource limits, and operational parameters. This guide covers all configuration options and provides examples for common deployment scenarios.
A stdio Bus configuration file consists of two main sections:
{"pools": [{"id": "worker-id","command": "/path/to/executable","args": ["arg1", "arg2"],"instances": 1}],"limits": {"max_input_buffer": 1048576,"max_output_queue": 4194304,"max_restarts": 5,"restart_window_sec": 60,"drain_timeout_sec": 30,"backpressure_timeout_sec": 60}}
Worker pools define which workers to run and how many instances of each.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique identifier for this worker pool |
command | string | Yes | Path to the executable (absolute or in PATH) |
args | string[] | No | Command-line arguments passed to the worker |
instances | number | Yes | Number of worker instances to spawn (≥ 1) |
env | object | No | Environment variables for the worker process |
Single worker instance:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 1}]}
Multiple worker instances:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 4}]}
With environment variables:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 2,"env": {"LOG_LEVEL": "debug","NODE_ENV": "production"}}]}
Resource limits control memory usage, restart behavior, and connection handling.
| Field | Type | Default | Description |
|---|---|---|---|
max_input_buffer | number | 1048576 (1 MB) | Maximum input buffer size per connection (bytes) |
max_output_queue | number | 4194304 (4 MB) | Maximum output queue size per connection (bytes) |
max_restarts | number | 5 | Maximum worker restarts within restart window |
restart_window_sec | number | 60 | Time window for counting restarts (seconds) |
drain_timeout_sec | number | 30 | Timeout for graceful shutdown (seconds) |
backpressure_timeout_sec | number | 60 | Timeout before closing connection when queue is full (seconds) |
Default limits:
{"limits": {"max_input_buffer": 1048576,"max_output_queue": 4194304,"max_restarts": 5,"restart_window_sec": 60,"drain_timeout_sec": 30,"backpressure_timeout_sec": 60}}
High-throughput limits:
{"limits": {"max_input_buffer": 4194304,"max_output_queue": 16777216,"max_restarts": 10,"restart_window_sec": 120,"drain_timeout_sec": 60,"backpressure_timeout_sec": 120}}
Conservative limits:
{"limits": {"max_input_buffer": 524288,"max_output_queue": 2097152,"max_restarts": 3,"restart_window_sec": 30,"drain_timeout_sec": 15,"backpressure_timeout_sec": 30}}
Minimal configuration for testing:
{"pools": [{"id": "echo-worker","command": "npx","args": ["@stdiobus/workers-registry","echo-worker"],"instances": 1}]}
Basic ACP protocol implementation:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 1}]}
With API keys configuration:
{"pools": [{"id": "registry-launcher","command": "npx","args": ["@stdiobus/workers-registry","registry-launcher","/path/to/api-keys.json"],"instances": 1}]}
For IDE integration:
{"pools": [{"id": "mcp-proxy","command": "npx","args": ["@stdiobus/workers-registry","mcp-to-acp-proxy"],"instances": 1,"env": {"ACP_HOST": "localhost","ACP_PORT": "9000","AGENT_ID": "claude-acp"}}]}
Run different worker types simultaneously:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 2},{"id": "echo-worker","command": "npx","args": ["@stdiobus/workers-registry","echo-worker"],"instances": 1},{"id": "registry-launcher","command": "npx","args": ["@stdiobus/workers-registry","registry-launcher","/path/to/api-keys.json"],"instances": 1}]}
Multiple instances of the same worker for load balancing:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 8}],"limits": {"max_input_buffer": 2097152,"max_output_queue": 8388608}}
Multiple workers with debug logging:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 1,"env": {"LOG_LEVEL": "debug","NODE_ENV": "development"}},{"id": "echo-worker","command": "npx","args": ["@stdiobus/workers-registry","echo-worker"],"instances": 1,"env": {"LOG_LEVEL": "debug"}}],"limits": {"max_restarts": 10,"restart_window_sec": 120}}
Production-ready configuration with multiple instances and appropriate limits:
{"pools": [{"id": "acp-registry","command": "npx","args": ["@stdiobus/workers-registry","acp-worker"],"instances": 4,"env": {"NODE_ENV": "production","LOG_LEVEL": "info"}},{"id": "registry-launcher","command": "npx","args": ["@stdiobus/workers-registry","registry-launcher","/etc/stdiobus/api-keys.json"],"instances": 2,"env": {"NODE_ENV": "production","LOG_LEVEL": "info"}}],"limits": {"max_input_buffer": 4194304,"max_output_queue": 16777216,"max_restarts": 5,"restart_window_sec": 60,"drain_timeout_sec": 30,"backpressure_timeout_sec": 60}}
Optimized for Docker deployment:
{"pools": [{"id": "acp-registry","command": "node","args": ["/workers-registry/out/dist/index.js","acp-worker"],"instances": 4,"env": {"NODE_ENV": "production","LOG_LEVEL": "warn"}}],"limits": {"max_input_buffer": 2097152,"max_output_queue": 8388608,"max_restarts": 3,"restart_window_sec": 60,"drain_timeout_sec": 30,"backpressure_timeout_sec": 60}}
Configuration for Kubernetes deployment with health checks:
{"pools": [{"id": "acp-registry","command": "node","args": ["/app/workers-registry/out/dist/index.js","acp-worker"],"instances": 2,"env": {"NODE_ENV": "production","LOG_LEVEL": "info","POD_NAME": "${POD_NAME}","POD_NAMESPACE": "${POD_NAMESPACE}"}}],"limits": {"max_input_buffer": 4194304,"max_output_queue": 16777216,"max_restarts": 5,"restart_window_sec": 60,"drain_timeout_sec": 45,"backpressure_timeout_sec": 90}}
Messages with the same sessionId are routed to the same worker instance. This is important for maintaining session state.
Session affinity is automatic when clients include sessionId in requests:
{"jsonrpc": "2.0","id": "1","method": "test","sessionId": "sess-123","params": {}}
Workers must preserve sessionId in responses:
{"jsonrpc": "2.0","id": "1","sessionId": "sess-123","result": {}}
When using session affinity:
{"pools": [{"id": "acp-registry","command": "node","args": ["..."],"instances": 4}],"limits": {"max_restarts": 5,"drain_timeout_sec": 60}}
Workers can receive environment variables through the pool configuration:
{"pools": [{"id": "worker","command": "node","args": ["..."],"instances": 1,"env": {"NODE_ENV": "production","LOG_LEVEL": "info","DEBUG": "false","TIMEOUT": "30000"}}]}
ACP Worker:
{"env": {"MCP_SERVERS": "server1,server2","MCP_CONFIG_PATH": "/path/to/mcp-servers.json"}}
Registry Launcher:
{"env": {"REGISTRY_URL": "https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json","CACHE_TTL": "3600"}}
MCP-to-ACP Proxy:
{"env": {"ACP_HOST": "localhost","ACP_PORT": "9000","AGENT_ID": "claude-acp"}}
docker run \--name stdiobus \-p 9000:9000 \-v $(pwd)/config.json:/config.json:ro \-v $(pwd):/stdiobus:ro \stdiobus/stdiobus:latest \--config /config.json --tcp 0.0.0.0:9000
./stdio_bus --config config.json --tcp 0.0.0.0:9000
./stdio_bus --config config.json --unix /tmp/stdiobus.sock
{"pools": [{"id": "worker","command": "node","args": ["..."],"instances": 1,"env": {"LOG_LEVEL": "debug","NODE_ENV": "development"}}],"limits": {"max_restarts": 10,"restart_window_sec": 120,"drain_timeout_sec": 15}}
{"pools": [{"id": "worker","command": "node","args": ["..."],"instances": 2,"env": {"LOG_LEVEL": "info","NODE_ENV": "staging"}}],"limits": {"max_input_buffer": 2097152,"max_output_queue": 8388608,"max_restarts": 5,"restart_window_sec": 60}}
{"pools": [{"id": "worker","command": "node","args": ["..."],"instances": 4,"env": {"LOG_LEVEL": "warn","NODE_ENV": "production"}}],"limits": {"max_input_buffer": 4194304,"max_output_queue": 16777216,"max_restarts": 3,"restart_window_sec": 60,"drain_timeout_sec": 30,"backpressure_timeout_sec": 60}}
Check:
Check:
Check:
Check: