mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

mcp: gate session lifecycle log demotion behind MCPGODEBUG - #1208

Open
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs
Open

mcp: gate session lifecycle log demotion behind MCPGODEBUG#1208
anneheartrecord wants to merge 2 commits into
modelcontextprotocol:mainfrom
anneheartrecord:fix/demote-session-lifecycle-logs

Conversation

@anneheartrecord

@anneheartrecordanneheartrecord commented Aug 28, 2026

Copy link
Copy Markdown

Session bookkeeping records (server connecting, server session connected/disconnected, session initialized, client log level set) log at info. On stateless streamable HTTP a session is minted per POST, so every request replays the whole lifecycle — four info lines of bookkeeping per tool call before the server logs anything of its own. The client log level set record additionally fires on every request carrying _meta under the 2026-07-28 spec, on all transports, even when the client set no level.

This gates the demotion of the five lifecycle records to debug behind MCPGODEBUG=demotesessionlifecyclelog=1, so the default behavior is unchanged for existing users (per review). Warn/error records are unchanged. If the demotion should become the default in a future minor, flipping the gate is a one-line change. Adds a test covering both paths: lifecycle visible at info by default; silent at info and visible at debug with the variable set.

Fixes#1204

@guglielmo-san

Copy link
Copy Markdown
Contributor

I agree overall with the change, but this introduces a behavioral change for existing users. We should gate the change behind an MCPGODEBUG variable

Session bookkeeping records (server connecting, server session
connected/disconnected, session initialized, client log level set)
logged at info. On stateless streamable HTTP a session is minted per
POST, so every request replays the whole lifecycle: four info lines of
bookkeeping per tool call before the server logs anything of its own.
The setLevel record additionally fires on every request carrying _meta
under the 2026-07-28 spec, on all transports.
Demote these five records to debug only when
MCPGODEBUG=demotesessionlifecyclelog=1; the default stays at info so
users who rely on the records see no change. If the demotion should
become the default in a future minor, flipping the gate is a one-line
change.
Fixesmodelcontextprotocol#1204
@anneheartrecord
anneheartrecordforce-pushed the fix/demote-session-lifecycle-logs branch from 9ed4506 to 9eed2eeCompareAugust 29, 2026 03:03
@anneheartrecordanneheartrecord changed the title mcp: log session lifecycle events at debug instead of infomcp: gate session lifecycle log demotion behind MCPGODEBUGAug 29, 2026
@anneheartrecord

Copy link
Copy Markdown
Author

@guglielmo-san done — force-pushed as a single commit (9eed2ee). The five lifecycle records now stay at info by default; setting MCPGODEBUG=demotesessionlifecyclelog=1 moves them to debug, so nothing changes for existing users unless they opt in. The knob follows the existing MCPGODEBUG compatibility-parameter pattern (cf. allowsessionsinstateless); if you'd rather have the demotion become the default in a future minor, flipping the gate is a one-line change.

Tests cover both paths (visible at info by default; silent at info and visible at debug with the variable set), -race clean. The only failures in go test ./mcp/ on this machine are the two *LocalhostProtection tests, which fail identically on clean main here (local environment).

Comment threadmcp/server.go
Comment on lines +36 to +43
// demotesessionlifecyclelog, when set to "1" via MCPGODEBUG, demotes routine
// session bookkeeping records ("server connecting", "server session
// connected", "server session disconnected", "session initialized", "client
// log level set") from info to debug. On stateless streamable HTTP a session
// is minted per request, so these fire constantly and drown out the server's
// own logs (#1204). It is gated behind MCPGODEBUG because demoting them
// changes log output that existing users may rely on.
var demotesessionlifecyclelog = mcpgodebug.Value("demotesessionlifecyclelog")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a description should be added in mcpgodebug.rc.md files

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session-lifecycle bookkeeping logs at info, spamming multiple log lines per request on stateless streamable HTTP

2 participants

@anneheartrecord@guglielmo-san