Skip to content

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@cetra3@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Match the shape of `CallToolResult` schema by cetra3 · Pull Request #377 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@cetra3@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Match the shape of `CallToolResult` schema by cetra3 · Pull Request #377 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@cetra3@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Match the shape of `CallToolResult` schema by cetra3 · Pull Request #377 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@cetra3@4t145
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Match the shape of `CallToolResult` schema by cetra3 · Pull Request #377 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

Match the shape of CallToolResult schema - #377

Merged
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema
Aug 19, 2025
Merged

Match the shape of CallToolResult schema#377
4t145 merged 1 commit into
modelcontextprotocol:mainfrom
cetra3:match_mcp_calltoolresult_schema

Conversation

@cetra3

Copy link
Copy Markdown
Contributor

Adjusts the content field to always be present

Motivation and Context

The MCP schema has the content field as mandatory: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/3b3874b4fc010f34ef5b106f044a4867534a9499/schema/2025-06-18/schema.ts#L782

Some of the MCP implementations (I.e, zed editor) assume (& rightly so) that this field is always present.

How Has This Been Tested?

Running tests

Breaking Changes

It is essentially a breaking change on the type CallToolResult

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

@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes labels Aug 18, 2025
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e7b34e8 to 5102dfdCompareAugust 18, 2025 04:29
@4t145
4t145 requested a review from CopilotAugust 18, 2025 06:06

CopilotAI left a comment

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.

Pull Request Overview

This PR modifies the CallToolResult schema to make the content field mandatory and always present, aligning with the MCP (Model Context Protocol) schema specification. The change ensures compatibility with MCP implementations that expect the content field to always exist.

Key changes:

  • Changed content field from Option<Vec<Content>> to Vec<Content> in the CallToolResult struct
  • Updated JSON schema to make content a required field and remove null type
  • Updated all test code to work with the non-optional content field

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
crates/rmcp/src/model.rsModified CallToolResult struct to make content field mandatory and updated related methods
crates/rmcp/tests/test_message_schema/server_json_rpc_message_schema.jsonUpdated JSON schema to make content required and remove null type
crates/rmcp/tests/test_tool_macros.rsUpdated test code to handle non-optional content field
crates/rmcp/tests/test_structured_output.rsUpdated test assertions and content access for mandatory content field

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The pattern match (None, Some(contents)) is unreachable because self.content is now a Vec<Content> (not Option<Vec<Content>>), so it can never be Some(contents). This should be (None, contents) and the condition should check if contents is not empty.

Copilot uses AI. Check for mistakes.
(Some(value), _) => return serde_json::from_value(value),
(None, Some(contents)) => {
if let Some(text) = contents.first().and_then(|c| c.as_text()) {
if let Some(text) = contents.as_text() {

CopilotAIAug 18, 2025

Copy link

Choose a reason for hiding this comment

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

The variable contents is now of type &Content (from first()) rather than &Vec<Content>, so calling contents.as_text() directly is incorrect. This should be accessing the first content item's text method.

Copilot uses AI. Check for mistakes.
@4t145

Copy link
Copy Markdown
Contributor

fix ci please

@github-actionsgithub-actionsBot added the T-examples Example code changes label Aug 19, 2025
BREAKING CHANGE: makes the `content` field non-optional
@cetra3
cetra3force-pushed the match_mcp_calltoolresult_schema branch from e1f79f2 to 38e42a7CompareAugust 19, 2025 03:58
@4t145

Copy link
Copy Markdown
Contributor

thanks

@4t145
4t145 merged commit a47cbaa into modelcontextprotocol:mainAug 19, 2025
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Aug 19, 2025
takumi-earth pushed a commit to earthlings-dev/rmcp that referenced this pull request Jan 27, 2026
BREAKING CHANGE: makes the `content` field non-optional
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-examplesExample code changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@cetra3@4t145