Skip to main content
Glama
WENLIXIAO-CS

tmux-mcp

by WENLIXIAO-CS
README.md
# tmux-mcp

[![PyPI](https://img.shields.io/pypi/v/tmux-mcp)](https://pypi.org/project/tmux-mcp/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

An [MCP](https://modelcontextprotocol.io/) server for controlling tmux sessions. Allows AI assistants to create, manage, and interact with tmux sessions, windows, and panes programmatically.

## Prerequisites

- Python 3.10+
- [tmux](https://github.com/tmux/tmux) installed and available on `PATH`

## Installation

### Claude Code (stdio)

```bash
claude mcp add tmux-mcp -- uvx tmux-mcp
```

### Claude Code (HTTP)

```bash
# Start the server
tmux-mcp --transport streamable-http --port 8888

# Add to Claude Code
claude mcp add --transport http tmux-mcp http://localhost:8888/mcp
```

### Claude Code (from GitHub)

```bash
claude mcp add tmux-mcp -- uvx --from git+https://github.com/WENLIXIAO-CS/tmux-mcp tmux-mcp
```

### pip

```bash
pip install tmux-mcp
```

## Available Tools

### Sessions
| Tool | Description |
|------|-------------|
| `tmux_list_sessions` | List all tmux sessions with names, IDs, window count, and attached status |
| `tmux_create_session` | Create a new detached session (returns session/window/pane IDs) |
| `tmux_rename_session` | Rename an existing session |

### Windows
| Tool | Description |
|------|-------------|
| `tmux_list_windows` | List windows, optionally filtered by session (includes pane count) |
| `tmux_create_window` | Create a new window in a session (returns window/pane IDs) |
| `tmux_select_window` | Switch to a specific window |
| `tmux_rename_window` | Rename a window |

### Panes
| Tool | Description |
|------|-------------|
| `tmux_list_panes` | List panes with IDs, dimensions, active status, and running command |
| `tmux_split_window` | Split a window/pane horizontally or vertically (returns new pane ID) |
| `tmux_select_pane` | Focus a specific pane |
| `tmux_resize_pane` | Resize a pane by direction+amount or absolute width/height |

### I/O
| Tool | Description |
|------|-------------|
| `tmux_send_keys` | Send keys or commands to a pane (supports special keys like Enter, C-c, Tab) |
| `tmux_read_pane` | Capture visible content from a pane (supports scrollback history) |
| `tmux_read_cc_pane` | Monitor a Claude Code pane — auto-waits during processing, auto-approves permissions, returns output when idle |

### Lifecycle
| Tool | Description |
|------|-------------|
| `tmux_kill` | Kill a session, window, or pane by target |

## Usage Examples

Create a session and run a command:

```
> Create a tmux session called "dev" and run "python server.py" in it

Tool call: tmux_create_session(name="dev")
-> Session 'dev' created. session_id=$1 window_id=@1 pane_id=%1

Tool call: tmux_send_keys(target="dev", keys="python server.py Enter")
-> Keys sent.
```

Read output from a pane:

```
> What's the output in the dev session?

Tool call: tmux_read_pane(target="dev")
-> $ python server.py
   Server running on port 8080
```

Split a window and run a second process:

```
> Split the dev window and start a log tail

Tool call: tmux_split_window(target="dev:0")
-> Pane created. pane_id=%2

Tool call: tmux_send_keys(target="%2", keys="tail -f app.log Enter")
-> Keys sent.
```

Monitor a Claude Code session (auto-wait + auto-approve):

```
> Run a task in the "cc" tmux session and wait for it to finish

Tool call: tmux_read_cc_pane(target="cc")
[  0.0s] Monitoring Claude Code pane 'cc'
[  0.0s] Permission requested: Do you want to → sending '1'
[  1.0s] Processing: Shimmying…
[  8.1s] Processing: · ↓ 345 tokens
[ 16.2s] Permission requested: 2. Yes, allow all edits → sending '1'
[ 32.4s] Processing: · ↓ 1.6k tokens
[115.3s] Idle: no activity indicators

-> (captured pane content with scrollback)
```

## Development

```bash
git clone https://github.com/WENLIXIAO-CS/tmux-mcp.git
cd tmux-mcp
uv sync
uv run tmux-mcp
```

## License

MIT

TDQS

A3.9/5.0

Scored across 19 tools

Disambiguation4/5

Most tools have clearly distinct purposes (create, list, read, send, resize, kill). The only potential confusion is between tmux_read_pane (general pane capture) and tmux_read_cc_pane (specialized for Claude Code monitoring), but their descriptions clearly differentiate them. Remote bash tools are clearly separated by the remote_bash_ prefix.

Naming Consistency5/5

All tools use consistent verb_noun snake_case with a domain prefix (tmux_, remote_bash_). The pattern is highly predictable (list_*, create_*, rename_*, select_*, etc.) across the entire set.

Tool Count3/5

At 19 tools, the set is slightly heavy for a single server, especially since 4 tools handle remote SSH (a separate domain). The tmux-specific tools alone (15) would be well-scoped; adding remote_bash pushes it into the borderline range.

Completeness5/5

The tmux lifecycle is fully covered: create, list, read, update, and delete for sessions, windows, and panes, plus send_keys, split, and resize. The remote_bash set is also complete with connect, execute, disconnect, and list. There are no obvious dead ends.

Maintenance

ActivityInactive
ResponsivenessNo issues