Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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" + '
fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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('^' + ".*" + ' fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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('^' + ".*" + ' fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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" + ' fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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('^' + ".*" + ' fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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('^' + ".*" + ' fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock
, '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); } })(); })(); fix(tasks): avoid dropping completed task results during collection by coinmoles · Pull Request #639 · modelcontextprotocol/rust-sdk · GitHub
Skip to content

fix(tasks): avoid dropping completed task results during collection - #639

Merged
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main
Feb 5, 2026
Merged

fix(tasks): avoid dropping completed task results during collection#639
alexhancock merged 3 commits into
modelcontextprotocol:mainfrom
coinmoles:main

Conversation

@coinmoles

Copy link
Copy Markdown
Contributor

Remove the std::mem::take from OperationProcessor::collect_completed_results

Motivation and Context

std::mem::take would clear OperationProcessor::completed_results, causing completed tasks to be dropped. This made tasks/get and tasks/result to fail for subsequent requests.

How Has This Been Tested?

  • All existing tests passed
  • Tested with a custom task server/client implementation (Will add this to examples if requested)

Breaking Changes

This is technically a breaking change that changes the return type of OperationProcessor::collect_completed_results from Vec<TaskResult> to (). However, I doubt there was anyone calling the method directly without using the #[tool_handler] macro.

I did this to avoid introducing an unnecessary clone call. If this is a problem, I can change the method so it returns either:

  • self.completed_results.clone()
  • An owned vector of newly collected items, which I think was the intended return value in the first place.

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

Fixes#638

@github-actionsgithub-actionsBot added T-test Testing related changes T-core Core library changes labels Feb 2, 2026
Comment threadcrates/rmcp/src/task_manager.rs Outdated

/// Collect completed results from running tasks and remove them from the running tasks map.
pub fn collect_completed_results(&mut self) -> Vec<TaskResult> {
pub fn collect_completed_results(&mut self) {

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.

thoughts on this being pub in the first place?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right now, the function has to be public because it is called from the output of #[task_handler] macro.

However, it would make sense to make this private and have OperationProcessor::peek_completed and OperationProcessor::take_completed_result call this before returning. Do you think that would be better?

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.

Yes, something like that makes sense to me. Can you make the change?

@coinmolescoinmolesFeb 5, 2026

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Pushed the change.

One thing that is slightly awkward is that peek_completed (and a few other functions whose names suggest non-mutating behavior) now requires &mut self. I think it is fine, but it could be slightly confusing.

Also, while I was doing that I realized that task_result_receiver has no real reason to be an Option (The channel is initialized on startup and not set again) and made it required.

@github-actionsgithub-actionsBot added the T-macros Macro changes label Feb 5, 2026
@alexhancock
alexhancock merged commit be23334 into modelcontextprotocol:mainFeb 5, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 4, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-coreCore library changesT-macrosMacro changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completed tasks are erased from OperationProcessor

2 participants

@coinmoles@alexhancock