Skip to content

fix(tui): suppress taskkill output for MCP teardown on Windows#21759

Merged
fcoury-oai merged 1 commit into
mainfrom
fcoury/fix-mcp-taskkill
May 10, 2026
Merged

fix(tui): suppress taskkill output for MCP teardown on Windows#21759
fcoury-oai merged 1 commit into
mainfrom
fcoury/fix-mcp-taskkill

Conversation

@fcoury-oai
Copy link
Copy Markdown
Contributor

@fcoury-oai fcoury-oai commented May 8, 2026

Why

On native Windows, running /mcp can leak taskkill's normal SUCCESS: messages into the Codex TUI while the temporary MCP inventory process tree is being torn down. That corrupts the screen even though MCP itself is working correctly.

Fixes #20845.

What Changed

  • Redirect the Windows-only MCP teardown taskkill subprocess to null stdio so its console output cannot reach the TUI.

How to Test

  1. On native Windows, configure a stdio MCP server, for example:
    codex mcp add sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking
  2. With the latest released Codex CLI, start Codex and run /mcp.
  3. Confirm the current behavior: taskkill SUCCESS: lines appear in the TUI during the MCP refresh.
  4. Switch to this branch's build, start Codex again, and run /mcp.
  5. Confirm the MCP inventory still renders normally and the taskkill lines no longer appear.
  6. Repeat /mcp once more on this branch to verify the regression does not recur on repeated inventory requests.

Targeted tests:

  • cargo test -p codex-rmcp-client
  • cargo test -p codex-rmcp-client --test process_group_cleanup --quiet

@fcoury-oai fcoury-oai changed the title Suppress taskkill output for MCP teardown on Windows fix(tui): suppress taskkill output for MCP teardown on Windows May 8, 2026
@fcoury-oai fcoury-oai enabled auto-merge (squash) May 8, 2026 15:22
@fcoury-oai fcoury-oai merged commit e5d0222 into main May 10, 2026
37 of 39 checks passed
@fcoury-oai fcoury-oai deleted the fcoury/fix-mcp-taskkill branch May 10, 2026 15:51
@github-actions github-actions Bot locked and limited conversation to collaborators May 10, 2026
fcoury-oai added a commit that referenced this pull request May 11, 2026
## Summary

This is the `exec-server` follow-up to #21759.

#21759 fixed the Windows `taskkill` output leak for the `rmcp-client`
MCP teardown path, but #22050 showed that `exec-server` still had a
parallel `taskkill /T /F` cleanup path in
`exec-server/src/connection.rs`. Because that command inherited the
parent stdio handles, Windows could still print `SUCCESS:` lines into
the user's terminal during stdio child cleanup.

This change silences that remaining `exec-server` callsite by
redirecting `taskkill` stdin, stdout, and stderr to `Stdio::null()`.

## What Changed

- add a Windows-only `Stdio` import in `exec-server/src/connection.rs`
- redirect the `taskkill` command in `kill_windows_process_tree` to
`Stdio::null()` for stdin, stdout, and stderr
- keep the existing kill semantics unchanged by still checking
`.status()` and preserving the existing fallback/logging behavior

## How to Test

Manual validation is Windows-only, so I did not run the UI repro path
locally here.

1. On Windows, use a Codex build from this branch.
2. Exercise an `exec-server` stdio flow that spawns a child process tree
and then triggers transport cleanup.
3. Confirm the child process tree is still torn down.
4. Confirm the terminal no longer shows `SUCCESS: The process with PID
... has been terminated.` lines during cleanup.

Targeted tests:
- `cargo test -p codex-exec-server
client::tests::dropping_stdio_client_terminates_spawned_process --
--exact`
- `cargo test -p codex-exec-server
client::tests::malformed_stdio_message_terminates_spawned_process --
--exact`

Notes:
- `cargo test -p codex-exec-server` still hits unrelated local macOS
`sandbox-exec: sandbox_apply: Operation not permitted` failures in
`tests/file_system.rs`.

## References

- Fixes the remaining callsite discussed in #22050
- Related earlier fix: #21759
agogo233 pushed a commit to agogo233/codex that referenced this pull request May 13, 2026
## Summary

This is the `exec-server` follow-up to openai#21759.

openai#21759 fixed the Windows `taskkill` output leak for the `rmcp-client`
MCP teardown path, but openai#22050 showed that `exec-server` still had a
parallel `taskkill /T /F` cleanup path in
`exec-server/src/connection.rs`. Because that command inherited the
parent stdio handles, Windows could still print `SUCCESS:` lines into
the user's terminal during stdio child cleanup.

This change silences that remaining `exec-server` callsite by
redirecting `taskkill` stdin, stdout, and stderr to `Stdio::null()`.

## What Changed

- add a Windows-only `Stdio` import in `exec-server/src/connection.rs`
- redirect the `taskkill` command in `kill_windows_process_tree` to
`Stdio::null()` for stdin, stdout, and stderr
- keep the existing kill semantics unchanged by still checking
`.status()` and preserving the existing fallback/logging behavior

## How to Test

Manual validation is Windows-only, so I did not run the UI repro path
locally here.

1. On Windows, use a Codex build from this branch.
2. Exercise an `exec-server` stdio flow that spawns a child process tree
and then triggers transport cleanup.
3. Confirm the child process tree is still torn down.
4. Confirm the terminal no longer shows `SUCCESS: The process with PID
... has been terminated.` lines during cleanup.

Targeted tests:
- `cargo test -p codex-exec-server
client::tests::dropping_stdio_client_terminates_spawned_process --
--exact`
- `cargo test -p codex-exec-server
client::tests::malformed_stdio_message_terminates_spawned_process --
--exact`

Notes:
- `cargo test -p codex-exec-server` still hits unrelated local macOS
`sandbox-exec: sandbox_apply: Operation not permitted` failures in
`tests/file_system.rs`.

## References

- Fixes the remaining callsite discussed in openai#22050
- Related earlier fix: openai#21759
agogo233 pushed a commit to agogo233/codex that referenced this pull request May 15, 2026
## Summary

This is the `exec-server` follow-up to openai#21759.

openai#21759 fixed the Windows `taskkill` output leak for the `rmcp-client`
MCP teardown path, but openai#22050 showed that `exec-server` still had a
parallel `taskkill /T /F` cleanup path in
`exec-server/src/connection.rs`. Because that command inherited the
parent stdio handles, Windows could still print `SUCCESS:` lines into
the user's terminal during stdio child cleanup.

This change silences that remaining `exec-server` callsite by
redirecting `taskkill` stdin, stdout, and stderr to `Stdio::null()`.

## What Changed

- add a Windows-only `Stdio` import in `exec-server/src/connection.rs`
- redirect the `taskkill` command in `kill_windows_process_tree` to
`Stdio::null()` for stdin, stdout, and stderr
- keep the existing kill semantics unchanged by still checking
`.status()` and preserving the existing fallback/logging behavior

## How to Test

Manual validation is Windows-only, so I did not run the UI repro path
locally here.

1. On Windows, use a Codex build from this branch.
2. Exercise an `exec-server` stdio flow that spawns a child process tree
and then triggers transport cleanup.
3. Confirm the child process tree is still torn down.
4. Confirm the terminal no longer shows `SUCCESS: The process with PID
... has been terminated.` lines during cleanup.

Targeted tests:
- `cargo test -p codex-exec-server
client::tests::dropping_stdio_client_terminates_spawned_process --
--exact`
- `cargo test -p codex-exec-server
client::tests::malformed_stdio_message_terminates_spawned_process --
--exact`

Notes:
- `cargo test -p codex-exec-server` still hits unrelated local macOS
`sandbox-exec: sandbox_apply: Operation not permitted` failures in
`tests/file_system.rs`.

## References

- Fixes the remaining callsite discussed in openai#22050
- Related earlier fix: openai#21759
agogo233 pushed a commit to agogo233/codex that referenced this pull request May 15, 2026
## Summary

This is the `exec-server` follow-up to openai#21759.

openai#21759 fixed the Windows `taskkill` output leak for the `rmcp-client`
MCP teardown path, but openai#22050 showed that `exec-server` still had a
parallel `taskkill /T /F` cleanup path in
`exec-server/src/connection.rs`. Because that command inherited the
parent stdio handles, Windows could still print `SUCCESS:` lines into
the user's terminal during stdio child cleanup.

This change silences that remaining `exec-server` callsite by
redirecting `taskkill` stdin, stdout, and stderr to `Stdio::null()`.

## What Changed

- add a Windows-only `Stdio` import in `exec-server/src/connection.rs`
- redirect the `taskkill` command in `kill_windows_process_tree` to
`Stdio::null()` for stdin, stdout, and stderr
- keep the existing kill semantics unchanged by still checking
`.status()` and preserving the existing fallback/logging behavior

## How to Test

Manual validation is Windows-only, so I did not run the UI repro path
locally here.

1. On Windows, use a Codex build from this branch.
2. Exercise an `exec-server` stdio flow that spawns a child process tree
and then triggers transport cleanup.
3. Confirm the child process tree is still torn down.
4. Confirm the terminal no longer shows `SUCCESS: The process with PID
... has been terminated.` lines during cleanup.

Targeted tests:
- `cargo test -p codex-exec-server
client::tests::dropping_stdio_client_terminates_spawned_process --
--exact`
- `cargo test -p codex-exec-server
client::tests::malformed_stdio_message_terminates_spawned_process --
--exact`

Notes:
- `cargo test -p codex-exec-server` still hits unrelated local macOS
`sandbox-exec: sandbox_apply: Operation not permitted` failures in
`tests/file_system.rs`.

## References

- Fixes the remaining callsite discussed in openai#22050
- Related earlier fix: openai#21759
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Windows: /mcp prints taskkill “SUCCESS” process termination logs

2 participants