fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire
, '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

fix: add compatibility handling for non-standard notifications - #247

Merged
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main
Jun 7, 2025
Merged

fix: add compatibility handling for non-standard notifications#247
jokemanfire merged 1 commit into
modelcontextprotocol:mainfrom
loocor:main

Conversation

@loocor

@loocorloocor commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

This PR addresses the issue where the Rust SDK fails to parse messages containing non-standard notifications (like notifications/stderr from @modelcontextprotocol/server-everything ), causing connection failures and preventing proper MCP communication.

The solution implements graceful handling of non-standard notifications at the transport layer in crates/rmcp/src/transport/async_rw.rs:

  • Introduced is_standard_notification function to check for standard MCP notifications.
  • Added try_parse_with_compatibility function to handle parsing messages with compatibility for non-standard notifications.
  • Updated the decoder implementation to utilize the new compatibility handling.
  • Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

Motivation and Context

Problem: When connecting to MCP servers that send non-standard notifications (such as Claude Desktop's notifications/stderr), the Rust SDK fails to deserialize these messages, causing the entire connection to fail with parsing errors.

Root Cause: The SDK's strict adherence to the MCP specification means any non-standard notification causes a deserialization failure, breaking the communication channel.

Why This Approach: Instead of hardcoding specific non-standard notification types into the core model (which would pollute the standard and require updates for each new non-standard notification), this solution:

  • Preserves the purity of the MCP specification in the core model
  • Provides universal compatibility with any non-standard notification
  • Maintains forward compatibility without code changes
  • Follows the principle of graceful degradation

How Has This Been Tested?

  • Real-world scenario: Tested against Claude Desktop MCP servers that send notifications/stderr
  • Unit tests: Added comprehensive tests for is_standard_notification and try_parse_with_compatibility functions
  • Integration testing: Verified that standard notifications continue to work correctly
  • Edge cases: Tested with malformed JSON, mixed standard/non-standard message streams
  • Logging verification: Confirmed that non-standard notifications are properly logged and ignored

Breaking Changes

None. This is a backward-compatible change that:

  • Does not modify existing APIs or data structures
  • Maintains all existing functionality for standard notifications
  • Only adds graceful handling for previously failing scenarios

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Design Philosophy: This solution follows the principle of "be liberal in what you accept, conservative in what you send." The SDK remains strict about outgoing messages (maintaining standard compliance) while being tolerant of incoming non-standard notifications.

Alternative Approaches Considered:

  1. Hardcoding specific types (like PR stderr-notification-handler #149): Rejected due to poor scalability and standard pollution
  2. Ignoring all parsing errors: Rejected as it would mask legitimate parsing issues
  3. Configuration-based filtering: Rejected as it adds complexity without significant benefit

Implementation Notes:

  • The is_standard_notification function should be updated when new official notifications are added to the MCP specification
  • Debug logging provides visibility into ignored non-standard notifications for troubleshooting
  • The solution operates at the transport layer, keeping the application layer clean

Future Considerations:

  • Could be extended to support configurable filtering of specific non-standard notifications
  • Metrics could be added to track the frequency of non-standard notifications
  • The approach could be generalized to handle other types of non-standard messages beyond notifications

…nc_rw
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.

@jokemanfirejokemanfire left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@jokemanfire
jokemanfire merged commit 37b4ddb into modelcontextprotocol:mainJun 7, 2025
@github-actionsgithub-actionsBot mentioned this pull request Jul 2, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
…nc_rw (modelcontextprotocol#247)
- Introduced `is_standard_notification` function to check for standard MCP notifications.
- Added `try_parse_with_compatibility` function to handle parsing messages with compatibility for non-standard notifications.
- Updated the decoder implementation to utilize the new compatibility handling.
- Added unit tests for standard notification checks and compatibility function to ensure correct behavior.
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.

2 participants

@loocor@jokemanfire