Skip to content

Commit 48d8fdf

Browse files
Copilotpelikhangithub-actions[bot]
authored
Remove session management from safe outputs MCP HTTP server (#22056)
* chore: start implementing session expiry removal from safe output mcp server Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> Agent-Logs-Url: https://github.com/github/gh-aw/sessions/6253a4d6-5bdc-4886-8c02-12f7da3cc06d * feat: remove session expiry from safe output MCP server Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> Agent-Logs-Url: https://github.com/github/gh-aw/sessions/6253a4d6-5bdc-4886-8c02-12f7da3cc06d * Add changeset [skip-ci] --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Peli de Halleux <pelikhan@users.noreply.github.com>
1 parent 492682b commit 48d8fdf

3 files changed

Lines changed: 15 additions & 20 deletions

File tree

.changeset/patch-remove-safe-outputs-session-management.md

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

actions/setup/js/safe-outputs-mcp-server.cjs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,20 @@ const { startHttpServer } = require("./safe_outputs_mcp_server_http.cjs");
1919

2020
logger.debug("Successfully required safe_outputs_mcp_server_http.cjs");
2121

22-
// Start the HTTP server
22+
// If run directly, start the HTTP server
2323
// The server reads configuration from ${RUNNER_TEMP}/gh-aw/safeoutputs/config.json
2424
// Port and API key are configured via environment variables:
2525
// - GH_AW_SAFE_OUTPUTS_PORT
2626
// - GH_AW_SAFE_OUTPUTS_API_KEY
2727
// Log directory is configured via GH_AW_MCP_LOG_DIR environment variable
28-
//
29-
// NOTE: The server runs in stateless mode (no session management) because
30-
// the MCP gateway doesn't perform the MCP protocol initialization handshake.
31-
// It directly calls methods like tools/list without the Mcp-Session-Id header.
3228
if (require.main === module) {
3329
logger.debug("In require.main === module block");
3430
const port = parseInt(process.env.GH_AW_SAFE_OUTPUTS_PORT || "3001", 10);
3531
const logDir = process.env.GH_AW_MCP_LOG_DIR;
3632
logger.debug(`Port: ${port}, LogDir: ${logDir}`);
3733
logger.debug("Calling startHttpServer...");
3834

39-
startHttpServer({ port, logDir, stateless: true }).catch(error => {
35+
startHttpServer({ port, logDir }).catch(error => {
4036
logger.debugError("Failed to start safe-outputs HTTP server: ", error);
4137
process.exit(1);
4238
});

actions/setup/js/safe_outputs_mcp_server_http.cjs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,20 @@ moduleLogger.debug("Module is being loaded");
1919
* This module extends the safe-outputs MCP server to support HTTP transport
2020
* using the StreamableHTTPServerTransport from the MCP SDK.
2121
*
22-
* It provides both stateful and stateless HTTP modes, as well as SSE streaming.
22+
* The server runs in stateless mode (no session management) because the MCP
23+
* gateway does not perform the MCP protocol initialization handshake and
24+
* directly calls methods like tools/list without an Mcp-Session-Id header.
2325
*
2426
* Usage:
25-
* node safe_outputs_mcp_server_http.cjs [--port 3000] [--stateless]
27+
* node safe_outputs_mcp_server_http.cjs [--port 3000]
2628
*
2729
* Options:
2830
* --port <number> Port to listen on (default: 3000)
29-
* --stateless Run in stateless mode (no session management)
3031
* --log-dir <path> Directory for log files
3132
*/
3233

3334
const http = require("http");
3435
moduleLogger.debug("Loaded http");
35-
const { randomUUID } = require("crypto");
36-
moduleLogger.debug("Loaded crypto");
3736
const { MCPServer, MCPHTTPTransport } = require("./mcp_http_transport.cjs");
3837
moduleLogger.debug("Loaded mcp_http_transport.cjs");
3938
const { createLogger: createMCPLogger } = require("./mcp_logger.cjs");
@@ -222,19 +221,17 @@ function createMCPServer(options = {}) {
222221
* Start the HTTP server with MCP protocol support
223222
* @param {Object} options - Server options
224223
* @param {number} [options.port] - Port to listen on (default: 3000)
225-
* @param {boolean} [options.stateless] - Run in stateless mode (default: false)
226224
* @param {string} [options.logDir] - Override log directory from config
227225
*/
228226
async function startHttpServer(options = {}) {
229227
const port = options.port || 3000;
230-
const stateless = options.stateless || false;
231228

232229
const logger = createMCPLogger("safe-outputs-startup");
233230

234-
logger.debug(`startHttpServer called with port=${port}, stateless=${stateless}`);
231+
logger.debug(`startHttpServer called with port=${port}`);
235232
logger.debug(`=== Starting Safe Outputs MCP HTTP Server ===`);
236233
logger.debug(`Port: ${port}`);
237-
logger.debug(`Mode: ${stateless ? "stateless" : "stateful"}`);
234+
logger.debug(`Mode: stateless`);
238235
logger.debug(`Environment: NODE_VERSION=${process.version}, PLATFORM=${process.platform}`);
239236

240237
// Create the MCP server
@@ -251,9 +248,9 @@ async function startHttpServer(options = {}) {
251248
logger.debug(`Tools configured: ${Object.keys(config).filter(k => config[k]).length}`);
252249

253250
logger.debug(`Creating HTTP transport...`);
254-
// Create the HTTP transport
251+
// Create the HTTP transport in stateless mode (no session management)
255252
const transport = new MCPHTTPTransport({
256-
sessionIdGenerator: stateless ? undefined : () => randomUUID(),
253+
sessionIdGenerator: undefined,
257254
enableJsonResponse: true,
258255
enableDnsRebindingProtection: false, // Disable for local development
259256
});
@@ -433,7 +430,6 @@ if (require.main === module) {
433430

434431
const options = {
435432
port: 3000,
436-
stateless: false,
437433
/** @type {string | undefined} */
438434
logDir: undefined,
439435
};
@@ -443,8 +439,6 @@ if (require.main === module) {
443439
if (args[i] === "--port" && args[i + 1]) {
444440
options.port = parseInt(args[i + 1], 10);
445441
i++;
446-
} else if (args[i] === "--stateless") {
447-
options.stateless = true;
448442
} else if (args[i] === "--log-dir" && args[i + 1]) {
449443
options.logDir = args[i + 1];
450444
i++;

0 commit comments

Comments
 (0)