MCP server for tmux — browse sessions, capture output, send commands.
MCP server that gives AI assistants full visibility into your tmux sessions — browse sessions, windows, and panes, read terminal output, and send commands.
Watch your AI agent work in real-time. Enable TMUX_MCP_ALWAYS_USE to force every shell command through a named tmux session instead of direct Bash — every command your AI runs appears live in your terminal, fully auditable.
Works with Claude Code, OpenCode, Cursor, Windsurf, and any MCP-compatible host.
Read your terminal state
See what's on screen
Create and organise
Clean up
Control panes
C-c to interrupt, Escape to exit, arrow keys, etc.Error-safe
list_sessionsLists all active tmux sessions. No parameters.
Returns: session name, number of windows, creation time, attached/detached status.
list_windowsLists windows inside a session.
| Parameter | Type | Description |
|---|---|---|
session | string | Session name (from list_sessions) |
Returns: window index, name, pane count, whether it's the active window.
list_panesLists panes inside a session or window.
| Parameter | Type | Description |
|---|---|---|
target | string | Session name (work) or session:window (work:0) |
Returns: pane index, title, dimensions (e.g. 220x50), whether it's active, running command.
capture_paneCaptures the current terminal output of a pane.
| Parameter | Type | Default | Description |
|---|---|---|---|
target | string | — | Pane target: session:window.pane (e.g. work:0.0) |
lines | number | 150 | Lines of scrollback to include (max 5000) |
Returns: raw terminal text as it appears on screen.
Security note: pane output can contain environment variables, API keys, tokens, and credentials if they were printed to the terminal. Only use this server in trusted local environments.
send_keysSends a command or key sequence to a pane and captures the result.
| Parameter | Type | Default | Description |
|---|---|---|---|
target | string | — | Pane target: session:window.pane |
keys | string | — | Command or tmux key notation (C-c, Escape, Up, etc.) |
enter | boolean | true | Press Enter after the keys |
capture_lines | number | 50 | Lines to capture after sending |
wait_ms | number | 400 | Milliseconds to wait before capturing |
Returns: confirmation + pane output after the command ran.
new_sessionCreates a new detached tmux session.
| Parameter | Type | Description |
|---|---|---|
name | string | Session name. Omit to let tmux auto-assign one. |
cwd | string | Working directory for the session. |
command | string | Shell command to run immediately in the first window. |
new_windowCreates a new window inside an existing session.
| Parameter | Type | Description |
|---|---|---|
session | string | Session to create the window in. |
name | string | Window name. |
cwd | string | Working directory for the new window. |
command | string | Shell command to run immediately. |
split_paneSplits a pane into two.
| Parameter | Type | Default | Description |
|---|---|---|---|
target | string | — | Pane or window to split: session:window.pane |
direction | horizontal | vertical | horizontal | horizontal = left/right split, vertical = top/bottom |
cwd | string | — | Working directory for the new pane. |
command | string | — | Shell command to run in the new pane. |
size | number | — | Size of the new pane as a percentage (1–99). |
kill_sessionKills a session and all its windows and panes. Destructive — cannot be undone.
| Parameter | Type | Description |
|---|---|---|
session | string | Session name to kill. |
kill_windowKills a window and all its panes. Destructive.
| Parameter | Type | Description |
|---|---|---|
target | string | Window target: session:window |
kill_paneKills a single pane and its running process. Destructive.
| Parameter | Type | Description |
|---|---|---|
target | string | Pane target: session:window.pane |
rename_session| Parameter | Type | Description |
|---|---|---|
session | string | Current session name. |
new_name | string | New name. |
rename_window| Parameter | Type | Description |
|---|---|---|
target | string | Window target: session:window |
new_name | string | New name. |
All tools use tmux's standard session:window.pane notation:
work → session named "work"
work:0 → window 0 of session "work"
work:0.0 → pane 0, window 0, session "work"
work:editor.1 → pane 1 of window named "editor" in session "work"
Use list_sessions → list_windows → list_panes to discover the right target before calling capture_pane or send_keys.
npm install -g @fr1sk/tmux-mcp
~/.config/opencode/opencode.json){
"mcp": {
"tmux": {
"type": "local",
"command": ["tmux-mcp"]
}
}
}
~/.claude/settings.json){
"mcpServers": {
"tmux": {
"command": "tmux-mcp"
}
}
}
mcp.json){
"mcpServers": {
"tmux": {
"command": "tmux-mcp"
}
}
}
What tmux sessions do I have running?
Show me the output of my dev server — it's in the work session
My tests are failing, check what's in work:1.0
Run git status in my work session and show me the output
Send Ctrl-C to work:0.0, the process is stuck
Tail the last 300 lines from the logs pane in my api session
Create a new session called 'dev' in ~/Projects/myapp and run npm run dev
Split work:0.0 vertically and run npm test in the new pane
Rename session 'new' to 'api'
Kill the old session named 'temp'
Set these in your MCP client config under environment to control agent behavior.
| Variable | Default | Description |
|---|---|---|
TMUX_MCP_DEFAULT_SESSION | — | Session name the agent routes commands to when alwaysUseTmux is on |
TMUX_MCP_ALWAYS_USE | false | Set to "true" to route all shell commands through tmux instead of direct Bash |
When both are set, the get_config tool returns an instructions field the agent uses to automatically route every shell command through send_keys in the configured session.
Example (OpenCode):
{
"mcp": {
"tmux": {
"type": "local",
"command": ["tmux-mcp"],
"environment": {
"TMUX_MCP_ALWAYS_USE": "true",
"TMUX_MCP_DEFAULT_SESSION": "dev"
}
}
}
}
This server provides unrestricted local shell access through tmux:
capture_pane — returns raw terminal output, which may include environment variables, API keys, tokens, database passwords, and SSH private keys if they were printed to the terminal.send_keys — executes arbitrary shell commands in the target pane. Any command the AI sends runs in your shell with your permissions.command parameter on new_session, new_window, and split_pane — passed directly to tmux, which runs it via $SHELL -c. No validation or sandboxing.Only use this server in trusted local development environments. Never expose it to network-accessible MCP hosts or untrusted AI assistants.
$PATHSource-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @fr1sk/tmux-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-fr1sk-tmux-mcp": {
"command": "npx",
"args": [
"-y",
"@fr1sk/tmux-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup reference@fr1sk/tmux-mcpnpmtmux-mcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.