Skip to content

tokio task not closed at shutdown #220

Description

@3DRaven

Describe the bug
When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

To Reproduce

  1. Attached full project example with the problem. mcp-problem-example.zip
  2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
    As example integration with cursor IDE
{
"mcpServers": {
"mcp-problem-example": {
"command": "sh",
"args": [
"path/to/mcp-problem-example/start.sh"
],
"env": []
},
}
  1. Run in terminal tokio-console https://crates.io/crates/tokio-console
  2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

Expected behavior
After stopping the MCP server, the process should be terminated.

Logs
All code has finished executing, but the task remains unclosed.

2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

Final message indicates the last log entry generated by the logger.

Additional context
The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

ps -A|grep mcp
880290 ? 00:00:00 mcp-problem-exa
889850 ? 00:00:00 mcp-problem-exa

tokio-console shows the issue — a task is not properly terminated.:

30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>

Metadata

Metadata

Assignees

Labels

T-bugBug fixes and error corrections

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , '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" + '
    tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
    Skip to content

    tokio task not closed at shutdown #220

    Description

    @3DRaven

    Describe the bug
    When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

    To Reproduce

    1. Attached full project example with the problem. mcp-problem-example.zip
    2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
      As example integration with cursor IDE
    {
    "mcpServers": {
    "mcp-problem-example": {
    "command": "sh",
    "args": [
    "path/to/mcp-problem-example/start.sh"
    ],
    "env": []
    },
    }
    1. Run in terminal tokio-console https://crates.io/crates/tokio-console
    2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

    Expected behavior
    After stopping the MCP server, the process should be terminated.

    Logs
    All code has finished executing, but the task remains unclosed.

    2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
    2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
    2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
    2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
    2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
    2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
    2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
    2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
    2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
    2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
    2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
    2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
    2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
    2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
    2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

    Final message indicates the last log entry generated by the logger.

    Additional context
    The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

    ps -A|grep mcp
    880290 ? 00:00:00 mcp-problem-exa
    889850 ? 00:00:00 mcp-problem-exa
    

    tokio-console shows the issue — a task is not properly terminated.:

    30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
    33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
    

    Metadata

    Metadata

    Assignees

    Labels

    T-bugBug fixes and error corrections

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , '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('^' + ".*" + ' tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
      Skip to content

      tokio task not closed at shutdown #220

      Description

      @3DRaven

      Describe the bug
      When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

      To Reproduce

      1. Attached full project example with the problem. mcp-problem-example.zip
      2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
        As example integration with cursor IDE
      {
      "mcpServers": {
      "mcp-problem-example": {
      "command": "sh",
      "args": [
      "path/to/mcp-problem-example/start.sh"
      ],
      "env": []
      },
      }
      1. Run in terminal tokio-console https://crates.io/crates/tokio-console
      2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

      Expected behavior
      After stopping the MCP server, the process should be terminated.

      Logs
      All code has finished executing, but the task remains unclosed.

      2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
      2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
      2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
      2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
      2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
      2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
      2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
      2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
      2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
      2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
      2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
      2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
      2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
      2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
      2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

      Final message indicates the last log entry generated by the logger.

      Additional context
      The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

      ps -A|grep mcp
      880290 ? 00:00:00 mcp-problem-exa
      889850 ? 00:00:00 mcp-problem-exa
      

      tokio-console shows the issue — a task is not properly terminated.:

      30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
      33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
      

      Metadata

      Metadata

      Assignees

      Labels

      T-bugBug fixes and error corrections

      Type

      No type

      Projects

      No projects

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , '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('^' + ".*" + ' tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
        Skip to content

        tokio task not closed at shutdown #220

        Description

        @3DRaven

        Describe the bug
        When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

        To Reproduce

        1. Attached full project example with the problem. mcp-problem-example.zip
        2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
          As example integration with cursor IDE
        {
        "mcpServers": {
        "mcp-problem-example": {
        "command": "sh",
        "args": [
        "path/to/mcp-problem-example/start.sh"
        ],
        "env": []
        },
        }
        1. Run in terminal tokio-console https://crates.io/crates/tokio-console
        2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

        Expected behavior
        After stopping the MCP server, the process should be terminated.

        Logs
        All code has finished executing, but the task remains unclosed.

        2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
        2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
        2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
        2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
        2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
        2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
        2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
        2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
        2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
        2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
        2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
        2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
        2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
        2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
        2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

        Final message indicates the last log entry generated by the logger.

        Additional context
        The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

        ps -A|grep mcp
        880290 ? 00:00:00 mcp-problem-exa
        889850 ? 00:00:00 mcp-problem-exa
        

        tokio-console shows the issue — a task is not properly terminated.:

        30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
        33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
        

        Metadata

        Metadata

        Assignees

        Labels

        T-bugBug fixes and error corrections

        Type

        No type

        Projects

        No projects

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , '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" + ' tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
          Skip to content

          tokio task not closed at shutdown #220

          Description

          @3DRaven

          Describe the bug
          When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

          To Reproduce

          1. Attached full project example with the problem. mcp-problem-example.zip
          2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
            As example integration with cursor IDE
          {
          "mcpServers": {
          "mcp-problem-example": {
          "command": "sh",
          "args": [
          "path/to/mcp-problem-example/start.sh"
          ],
          "env": []
          },
          }
          1. Run in terminal tokio-console https://crates.io/crates/tokio-console
          2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

          Expected behavior
          After stopping the MCP server, the process should be terminated.

          Logs
          All code has finished executing, but the task remains unclosed.

          2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
          2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
          2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
          2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
          2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
          2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
          2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
          2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
          2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
          2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
          2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
          2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
          2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
          2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
          2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

          Final message indicates the last log entry generated by the logger.

          Additional context
          The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

          ps -A|grep mcp
          880290 ? 00:00:00 mcp-problem-exa
          889850 ? 00:00:00 mcp-problem-exa
          

          tokio-console shows the issue — a task is not properly terminated.:

          30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
          33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
          

          Metadata

          Metadata

          Assignees

          Labels

          T-bugBug fixes and error corrections

          Type

          No type

          Projects

          No projects

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , '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('^' + ".*" + ' tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
            Skip to content

            tokio task not closed at shutdown #220

            Description

            @3DRaven

            Describe the bug
            When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

            To Reproduce

            1. Attached full project example with the problem. mcp-problem-example.zip
            2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
              As example integration with cursor IDE
            {
            "mcpServers": {
            "mcp-problem-example": {
            "command": "sh",
            "args": [
            "path/to/mcp-problem-example/start.sh"
            ],
            "env": []
            },
            }
            1. Run in terminal tokio-console https://crates.io/crates/tokio-console
            2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

            Expected behavior
            After stopping the MCP server, the process should be terminated.

            Logs
            All code has finished executing, but the task remains unclosed.

            2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
            2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
            2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
            2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
            2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
            2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
            2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
            2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
            2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
            2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
            2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
            2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
            2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
            2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
            2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

            Final message indicates the last log entry generated by the logger.

            Additional context
            The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

            ps -A|grep mcp
            880290 ? 00:00:00 mcp-problem-exa
            889850 ? 00:00:00 mcp-problem-exa
            

            tokio-console shows the issue — a task is not properly terminated.:

            30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
            33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
            

            Metadata

            Metadata

            Assignees

            Labels

            T-bugBug fixes and error corrections

            Type

            No type

            Projects

            No projects

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , '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('^' + ".*" + ' tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
              Skip to content

              tokio task not closed at shutdown #220

              Description

              @3DRaven

              Describe the bug
              When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

              To Reproduce

              1. Attached full project example with the problem. mcp-problem-example.zip
              2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
                As example integration with cursor IDE
              {
              "mcpServers": {
              "mcp-problem-example": {
              "command": "sh",
              "args": [
              "path/to/mcp-problem-example/start.sh"
              ],
              "env": []
              },
              }
              1. Run in terminal tokio-console https://crates.io/crates/tokio-console
              2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

              Expected behavior
              After stopping the MCP server, the process should be terminated.

              Logs
              All code has finished executing, but the task remains unclosed.

              2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
              2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
              2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
              2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
              2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
              2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
              2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
              2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
              2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
              2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
              2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
              2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
              2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
              2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
              2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

              Final message indicates the last log entry generated by the logger.

              Additional context
              The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

              ps -A|grep mcp
              880290 ? 00:00:00 mcp-problem-exa
              889850 ? 00:00:00 mcp-problem-exa
              

              tokio-console shows the issue — a task is not properly terminated.:

              30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
              33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
              

              Metadata

              Metadata

              Assignees

              Labels

              T-bugBug fixes and error corrections

              Type

              No type

              Projects

              No projects

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , '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); } })(); })(); tokio task not closed at shutdown · Issue #220 · modelcontextprotocol/rust-sdk · GitHub
                Skip to content

                tokio task not closed at shutdown #220

                Description

                @3DRaven

                Describe the bug
                When performing a graceful shutdown with a Tokio cancellation token, the task that reads from stdin does not terminate properly, causing the process to remain running.

                To Reproduce

                1. Attached full project example with the problem. mcp-problem-example.zip
                2. Add integration with this MCP server to MCP inspector or cursor IDE with stdio transport.
                  As example integration with cursor IDE
                {
                "mcpServers": {
                "mcp-problem-example": {
                "command": "sh",
                "args": [
                "path/to/mcp-problem-example/start.sh"
                ],
                "env": []
                },
                }
                1. Run in terminal tokio-console https://crates.io/crates/tokio-console
                2. Disconnect/Turn off from the MCP server in client (IDE or inspector)

                Expected behavior
                After stopping the MCP server, the process should be terminated.

                Logs
                All code has finished executing, but the task remains unclosed.

                2025-05-25T13:24:17.338Z INFO mcp_problem_example: Tracing initialized successfully
                2025-05-25T13:24:17.338Z INFO mcp_problem_example: Starting server in work directory: example/mcp-problem-example 2025-05-25T13:24:17.340Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: Starting MCP service
                2025-05-25T13:24:17.341Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}:serve_inner: rmcp::service: Service initialized as server peer_info=InitializeRequestParam { protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, roots: Some(RootsCapabilities { list_changed: Some(false) }), sampling: None }, client_info: Implementation { name: "cursor-vscode", version: "1.0.0" } }
                2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server initialized
                2025-05-25T13:24:17.342Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=PeerMessage(Request(ListToolsRequest(Request { method: ListToolsRequestMethod, params: None }), Number(1)))
                2025-05-25T13:24:17.342Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: received request id=1 request=ListToolsRequest(Request { method: ListToolsRequestMethod, params: None })
                2025-05-25T13:24:17.343Z INFO runtime.spawn{kind=task task.name= task.id=32 size.bytes=1168 loc.file="/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=604 loc.col=25}: rmcp::service: response message id=1 result=ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] })
                2025-05-25T13:24:17.344Z DEBUG runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: new event evt=ToSink(Response(ListToolsResult(ListToolsResult { next_cursor: None, tools: [Tool { name: "search_implemented", description: "Search for implemented symbols in the project", input_schema: {"$schema": String("http://json-schema.org/draft-07/schema#"), "properties": Object {"first": Object {"items": Object {"type": String("string")}, "type": String("array")}, "second": Object {"items": Object {"type": String("string")}, "type": String("array")}}, "required": Array [String("first"), String("second")], "title": String("McpRequest"), "type": String("object")} }] }), Number(1)))
                2025-05-25T13:24:30.801Z DEBUG runtime.spawn{kind=task task.name= task.id=23 size.bytes=160 loc.file="src/main.rs" loc.line=21 loc.col=6}: tokio_graceful_shutdown::signal_handling: Received SIGTERM.
                2025-05-25T13:24:30.802Z INFO tokio_graceful_shutdown::toplevel: Shutting down ...
                2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: task cancelled
                2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=30 size.bytes=928 loc.file="~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rmcp-0.1.5/src/service.rs" loc.line=495 loc.col=18}: rmcp::service: serve finished quit_reason=Cancelled
                2025-05-25T13:24:30.802Z INFO runtime.spawn{kind=task task.name= task.id=24 size.bytes=1336 loc.file="src/main.rs" loc.line=17 loc.col=11}: mcp_problem_example: MCP server shutdown with reason: Cancelled
                2025-05-25T13:24:30.803Z INFO tokio_graceful_shutdown::toplevel: Shutdown finished.
                2025-05-25T13:24:30.803Z INFO mcp_problem_example: Finall message 

                Final message indicates the last log entry generated by the logger.

                Additional context
                The previous process is not terminated properly, so each rerun spawns an additional process that continues running in the background:

                ps -A|grep mcp
                880290 ? 00:00:00 mcp-problem-exa
                889850 ? 00:00:00 mcp-problem-exa
                

                tokio-console shows the issue — a task is not properly terminated.:

                30 ⏫ 8m15s 2ms 8m02s 13s 6 task <cargo>/rmcp-0.1.5/src/service.rs:495:18 size.bytes=928 target=tokio::task │
                33 ▶ 8m15s 8m15s 0ns 131µs 1 blocking <cargo>/tokio-1.45.1/src/io/blocking.rs:76:46 fn=<tokio::io::blocking::Blocking<std::io::stdio::Stdin>
                

                Metadata

                Metadata

                Assignees

                Labels

                T-bugBug fixes and error corrections

                Type

                No type

                Projects

                No projects

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions