diff --git a/AGENTS.md b/AGENTS.md index e743998e..6d17e551 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -376,7 +376,7 @@ DEBUG_COLORS=0 DEBUG=* ./awmg --config config.toml - `MCP_GATEWAY_PAYLOAD_DIR` - Large payload storage directory (sets default for `--payload-dir` flag, default: `/tmp/jq-payloads`) - `MCP_GATEWAY_PAYLOAD_PATH_PREFIX` - Path prefix for remapping payloadPath returned to clients (sets default for `--payload-path-prefix` flag, default: empty) - `MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD` - Size threshold in bytes for payload storage; payloads larger than this are stored to disk (sets default for `--payload-size-threshold` flag, default: `524288`) -- `MCP_GATEWAY_SESSION_TIMEOUT` - Session timeout for unified mode (`/mcp`) stateful sessions. Accepts Go duration strings (e.g., `30m`, `1h`, `2h30m`). Routed mode is unaffected (hardcoded 30 min). (default: `2h`) +- `MCP_GATEWAY_SESSION_TIMEOUT` - Session timeout for unified mode (`/mcp`) stateful sessions. Accepts Go duration strings (e.g., `30m`, `1h`, `2h30m`). Routed mode is unaffected (hardcoded 30 min). (default: `6h`) - `DOCKER_HOST` - Docker daemon socket path (default: `/var/run/docker.sock`) - `MCP_GATEWAY_GUARDS_SINK_SERVER_IDS` - Comma-separated server IDs whose RPC JSONL logs should include agent secrecy/integrity tag snapshots (sets default for `--guards-sink-server-ids`) - `MCP_GATEWAY_GUARDS_MODE` - Guards enforcement mode: `strict` (deny violations), `filter` (remove denied tools), `propagate` (auto-adjust agent labels) (sets default for `--guards-mode`, default: `strict`) diff --git a/docs/ENVIRONMENT_VARIABLES.md b/docs/ENVIRONMENT_VARIABLES.md index 255a7e1b..9303cc04 100644 --- a/docs/ENVIRONMENT_VARIABLES.md +++ b/docs/ENVIRONMENT_VARIABLES.md @@ -25,7 +25,7 @@ When running locally (`run.sh`), these variables are optional (warnings shown if | `MCP_GATEWAY_PAYLOAD_DIR` | Large payload storage directory (sets default for `--payload-dir` flag) | `/tmp/jq-payloads` | | `MCP_GATEWAY_PAYLOAD_PATH_PREFIX` | Path prefix for remapping payloadPath returned to clients (sets default for `--payload-path-prefix` flag) | (empty - use actual filesystem path) | | `MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD` | Size threshold in bytes for payload storage (sets default for `--payload-size-threshold` flag) | `524288` | -| `MCP_GATEWAY_SESSION_TIMEOUT` | Session timeout for unified mode (`/mcp`) stateful sessions. Accepts Go duration strings (e.g., `30m`, `1h`). Default is 2 hours to accommodate long-running agentic workflows. Routed mode is unaffected (hardcoded 30 min). | `2h` | +| `MCP_GATEWAY_SESSION_TIMEOUT` | Session timeout for unified mode (`/mcp`) stateful sessions. Accepts Go duration strings (e.g., `30m`, `1h`). Default is 6 hours to match the GitHub Actions default timeout. Routed mode is unaffected (hardcoded 30 min). | `6h` | | `MCP_GATEWAY_WASM_GUARDS_DIR` | Root directory for per-server WASM guards (`//*.wasm`, first match is loaded) | (disabled) | | `MCP_GATEWAY_GUARDS_MODE` | Guards enforcement mode: `strict` (deny violations), `filter` (remove denied tools), `propagate` (auto-adjust agent labels) (sets default for `--guards-mode`) | `strict` | | `MCP_GATEWAY_GUARDS_SINK_SERVER_IDS` | Comma-separated sink server IDs for JSONL guards tag enrichment (sets default for `--guards-sink-server-ids`) | (disabled) | diff --git a/internal/envutil/envutil_test.go b/internal/envutil/envutil_test.go index c1230d58..ed0cbebf 100644 --- a/internal/envutil/envutil_test.go +++ b/internal/envutil/envutil_test.go @@ -112,17 +112,17 @@ func TestGetEnvDurationRealWorldScenarios(t *testing.T) { defer os.Unsetenv("MCP_GATEWAY_SESSION_TIMEOUT") // Default case - result := GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 2*time.Hour) - assert.Equal(t, 2*time.Hour, result) + result := GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 6*time.Hour) + assert.Equal(t, 6*time.Hour, result) // Override with shorter timeout os.Setenv("MCP_GATEWAY_SESSION_TIMEOUT", "30m") - result = GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 2*time.Hour) + result = GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 6*time.Hour) assert.Equal(t, 30*time.Minute, result) // Override with longer timeout os.Setenv("MCP_GATEWAY_SESSION_TIMEOUT", "4h") - result = GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 2*time.Hour) + result = GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 6*time.Hour) assert.Equal(t, 4*time.Hour, result) }) } diff --git a/internal/server/transport.go b/internal/server/transport.go index 478e3fb8..608e6d4c 100644 --- a/internal/server/transport.go +++ b/internal/server/transport.go @@ -38,7 +38,7 @@ func CreateHTTPServerForMCP(addr string, unifiedServer *UnifiedServer, apiKey st }, &sdk.StreamableHTTPOptions{ Stateless: false, // Support stateful sessions Logger: logger.NewSlogLoggerWithHandler(logTransport), // Integrate SDK logging with project logger - SessionTimeout: envutil.GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 2*time.Hour), // Configurable; 2h default accommodates long-running workflows with idle periods + SessionTimeout: envutil.GetEnvDuration("MCP_GATEWAY_SESSION_TIMEOUT", 6*time.Hour), // Configurable; 6h default matches GitHub Actions default timeout }) // Apply standard middleware stack (SDK logging → shutdown check → auth)