# MCPViewerScreen

> **Class** in `deepagents_code`

📖 [View in docs](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen)

Modal viewer for active MCP servers and their tools.

Displays servers grouped by name with transport type and tool count.
Navigate with arrow keys, Enter to expand/collapse tool descriptions,
start in-app OAuth login for an unauthenticated server, or inspect a
failed server. Ctrl+R requests a reconnect, F2 on a server header
toggles its disabled state, and Escape closes the modal.

Dismisses with `None` when closed without action, the server name to
drive an in-TUI OAuth login when the user activates an
`unauthenticated` server header, or `MCP_VIEWER_RECONNECT_REQUEST`
for a reconnect. The disable/enable toggle (`F2`) is handled in-place
via the `on_toggle_disable` callback so the screen never tears down
— see the constructor.

## Signature

```python
MCPViewerScreen(
    self,
    server_info: list[MCPServerInfo],
    *,
    connecting: bool = False,
    pending_reconnect: bool = False,
    on_toggle_disable: Callable[[str], Awaitable[None]] | None = None,
)
```

## Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `server_info` | `list[MCPServerInfo]` | Yes | List of MCP server metadata to display. |
| `connecting` | `bool` | No | When `True` and `server_info` is empty, show a "connecting..." placeholder instead of the "no servers" message; the screen refreshes when `refresh_server_info` is called after the server startup completes. (default: `False`) |
| `pending_reconnect` | `bool` | No | `True` when a deferred MCP login is queued and a restart will pick it up. Surfaces the `Ctrl+R` reconnect hint in the footer; the keybind itself is a no-op when this is `False`. (default: `False`) |
| `on_toggle_disable` | `Callable[[str], Awaitable[None]] \| None` | No | Async callback invoked with the selected server's name when the user presses `F2` on a header row. The callback persists the new disabled state and is expected to call `refresh_server_info` on this screen so the user sees the updated status without a screen swap. When `None`, `F2` is a no-op. (default: `None`) |

## Extends

- `ModalScreen[str | None]`

## Constructors

```python
__init__(
    self,
    server_info: list[MCPServerInfo],
    *,
    connecting: bool = False,
    pending_reconnect: bool = False,
    on_toggle_disable: Callable[[str], Awaitable[None]] | None = None,
) -> None
```

| Name | Type |
|------|------|
| `server_info` | `list[MCPServerInfo]` |
| `connecting` | `bool` |
| `pending_reconnect` | `bool` |
| `on_toggle_disable` | `Callable[[str], Awaitable[None]] \| None` |


## Properties

- `BINDINGS`
- `CSS`

## Methods

- [`refresh_server_info()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/refresh_server_info)
- [`apply_server_disable_toggle()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/apply_server_disable_toggle)
- [`on_input_changed()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/on_input_changed)
- [`compose()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/compose)
- [`on_mount()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/on_mount)
- [`action_move_up()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_move_up)
- [`action_move_down()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_move_down)
- [`action_jump_up()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_jump_up)
- [`action_jump_down()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_jump_down)
- [`show_server_error()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/show_server_error)
- [`action_toggle_expand()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_toggle_expand)
- [`action_toggle_all()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_toggle_all)
- [`action_page_up()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_page_up)
- [`action_page_down()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_page_down)
- [`action_cancel()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_cancel)
- [`action_reconnect()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_reconnect)
- [`action_toggle_disable()`](https://reference.langchain.com/python/deepagents-code/widgets/mcp_viewer/MCPViewerScreen/action_toggle_disable)

---

[View source on GitHub](https://github.com/langchain-ai/deepagents/blob/0412009c5441bef8d75a427e1da8909e33ab5b56/libs/code/deepagents_code/widgets/mcp_viewer.py#L760)