使用说明
tmux mcp rs
tmux-mcp-rs 是tmux的模型上下文协议(MCP)服务器。它允许MCP客户端创建会话、塑造窗口和窗格、运行跟踪命令、检查输出、管理tmux缓冲区,并通过结构化工具而不是脆弱的屏幕抓取来驱动交互式终端程序。
当代理需要真实的TTY、长时间运行的命令、并行窗格、可恢复的终端状态或人类可以在同一任务期间附加的tmux会话时,请使用它。
[!警告] 此服务器可以让MCP客户端运行shell命令、在窗格中键入内容、读取终端输出、修改tmux会话以及读取或写入tmux缓冲区。默认运行时策略是允许的。使用隔离的tmux套接字和
config.toml在将其暴露给您不完全信任的客户端之前,请先执行策略。
目录
服务器提供什么
- 具有结构化输入和输出的会话、窗口、窗格、客户端和缓冲区工具。
execute-command和get-command-result用于具有命令ID、资源URI、状态、输出和侧通道退出代码跟踪的shell命令(可选waitMs;更倾向于资源订阅以完成)。- 窗格、窗口、会话、客户端、服务器和跟踪命令资源,用于轻量级状态检查,而无需重新运行工具。
- 交互式程序、提示、REPL和TUI的可选原始输入工具。
- 工具筛选、命令筛选、套接字/会话/窗格作用域和粗略操作组的运行时策略控制。
- 编译时功能标志,用于从二进制文件中删除原始输入工具以进行强化构建。
- 可选的SSH路由,以便本地MCP服务器可以控制远程tmux服务器。
MCP路径通常比普通的tmux技能更可靠,因为每个操作都有一个命名的工具、类型化的参数、稳定的ID和结构化的响应。客户端不需要从捕获的文本中推断窗格ID,也不需要解析命令输出来确定命令是否已完成。
需求
- tmux 3.0或更新版本
PATH. - 从源代码构建时使用Rust 1.70或更高版本。
- 命令跟踪器支持的shell:
bash,zsh,或fish.
启动时,服务器运行 tmux -V。当它检测到tmux 2.x时,它会退出,因为tmux 2.x使用不同的输出格式和分割标志。如果无法检测到版本,启动将继续,受影响的工具调用将报告tmux错误。
安装
货物
cargo install tmux-mcp-rs
家酿
brew install bnomei/tmux-mcp/tmux-mcp-rs
npm
npx @bnomei/tmux-mcp-rs --version
# or: npm install -g @bnomei/tmux-mcp-rs
npm包是一个精简的包装器:在第一次运行时,它下载匹配的GitHub Release二进制文件,验证 .sha256,缓存它,并转发argv。
码头工人
docker run --rm ghcr.io/bnomei/tmux-mcp:0.6.0 --version
图片是 独立的:它包括阿尔卑斯山 tmux 3.x和预构建的musl Linux二进制文件。会话运行 集装箱内,不在桌面tmux服务器上。
- 默认值(推荐用于Docker): 隔离代理沙盒。人类附着用途
docker exec(见下文)。 - 可选(仅限Linux): 挂载一个主机tmux套接字,这样容器就可以驱动一个主机端服务器
tmux attach以本地。macOS/Windows上的Docker Desktop通常无法通过这种方式访问主机Unix套接字。 - 为了便于人/代理在笔记本电脑上共同连接,最好在主机上使用Homebrew、cargo或npm,而不是Docker。
stdio MCP客户端(保持stdin连接):
docker run --rm -i \
--name tmux-mcp \
-v "$PWD:/workspace" \
ghcr.io/bnomei/tmux-mcp:0.6.0
观看容器内创建的会话:
docker exec -it tmux-mcp tmux attach -t workspace
Linux主机插座接线(高级):
# host: start an isolated tmux server
tmux -S /tmp/tmux-mcp-agent.sock -f /dev/null new-session -d -s workspace
# container: talk to that socket (image still needs its own tmux client)
docker run --rm -i \
-v /tmp/tmux-mcp-agent.sock:/tmp/tmux-mcp-agent.sock \
--user "$(id -u):$(id -g)" \
ghcr.io/bnomei/tmux-mcp:0.6.0 \
--socket /tmp/tmux-mcp-agent.sock
# host: attach as usual
tmux -S /tmp/tmux-mcp-agent.sock attach -t workspace
当权限失败时,将容器UID/GID与套接字所有者匹配。更多细节: 包装/README.md.
GitHub发布
从下载预构建的存档 GitHub发布,提取并放置 tmux-mcp-rs 在你的 PATH.
来源
git clone https://github.com/bnomei/tmux-mcp.git
cd tmux-mcp
cargo build --release
二进制文件被写入 target/release/tmux-mcp-rs.
验证安装
tmux -V
tmux-mcp-rs --version
预期产量:
tmux 3.x
tmux-mcp-rs <version>
快速开始
-
将服务器添加到MCP客户端。
Codex CLI:
codex mcp add tmux -- tmux-mcp-rs克劳德代码:
claude mcp add --transport stdio tmux -- tmux-mcp-rs通用MCP客户端配置:
{ "mcpServers": { "tmux": { "command": "tmux-mcp-rs" } } } -
在MCP客户端中,要求代理创建或列出tmux会话。
典型的第一项任务是:
Create a tmux session named workspace, list its windows and panes, then run pwd in the first pane.工具响应应包括会话ID、窗口ID、窗格ID和
commandId对于被跟踪的命令。 -
如果您想观看或参与,请附加到同一个tmux会话。
tmux attach -t workspace
为了更安全地进行多代理工作,请从隔离的套接字而不是默认的tmux服务器开始:
tmux -S /tmp/tmux-mcp-agent.sock -f /dev/null new-session -d -s workspace
tmux -S /tmp/tmux-mcp-agent.sock attach -t workspace
然后配置MCP服务器 --socket /tmp/tmux-mcp-agent.sock, TMUX_MCP_SOCKET=/tmp/tmux-mcp-agent.sock,或每个工具 socket 以(权力)否决
客户端配置
使用 args 当您的MCP客户端接受JSON配置时:
{
"mcpServers": {
"tmux": {
"command": "tmux-mcp-rs",
"args": [
"--shell-type",
"zsh",
"--socket",
"/tmp/tmux-mcp-agent.sock",
"--config",
"/path/to/config.toml"
]
}
}
}
对于远程tmux服务器,添加 --ssh:
{
"mcpServers": {
"tmux": {
"command": "tmux-mcp-rs",
"args": [
"--ssh",
"user@host",
"--socket",
"/tmp/tmux-mcp-agent.sock"
]
}
}
}
除以下工具外的所有MCP工具 socket-for-path 接受可选 socket 参数。如果工具省略了它,服务器将使用进程默认套接字。
配置参考
tmux-mcp-rs 不自动加载配置文件。通过一个 --config /path/to/config.toml.
CLI选项
| 选项 | 默认值 | 描述 |
|---|---|---|
--shell-type <SHELL> |
bash |
Shell用于Shell感知命令跟踪。支持的值: bash, zsh, fish.如果 [shell].type 如果配置文件中存在,则配置值获胜。 |
--config <PATH> |
unset | 要读取的TOML配置文件。无效的TOML、无效的正则表达式和未知的工具或组无法启动。 |
--socket <PATH> |
tmux默认套接字 | 设置 TMUX_MCP_SOCKET 对于此服务器进程。A每个工具 socket 参数仍然在该调用中获胜。 |
--ssh <CONNECTION> |
unset | 通过SSH路由tmux命令。此值获胜 [ssh].remote 和 TMUX_MCP_SSH. |
--help |
n/a | 打印CLI帮助。 |
--version |
n/a | 打印二进制版本。 |
环境变量
| 变量 | 描述 |
|---|---|
TMUX_MCP_SOCKET |
没有每个工具时的默认tmux套接字路径 socket 提供了覆盖。如果未设置,服务器将使用tmux的默认套接字路径: $TMUX_TMPDIR/tmux-$UID/default,或 /tmp/tmux-$UID/default 当 TMUX_TMPDIR 未设置。 |
TMUX_MCP_SSH |
SSH连接字符串在以下情况下使用 --ssh 和 [ssh].remote 未设置。使用shell单词规则解析字符串。不平衡的报价无法启动。 |
TMUX_MCP_TOOLS |
按进程覆盖 [security.tools].使用 allow:<items> 或 deny:<items>。如果没有前缀,该值将被视为denylist。 |
RUST_LOG |
通过以下方式启用跟踪输出 tracing-subscriber 当设置时。日志被写入stderr。 |
优先级规则:
| 设置 | 优先级 |
|---|---|
| 插座 | 每个工具 socket 参数,然后 --socket 或 TMUX_MCP_SOCKET,然后是tmux默认套接字路径。 |
| SSH | --ssh那么 [ssh].remote那么 TMUX_MCP_SSH然后没有SSH。 |
| 外壳类型 | [shell].type那么 --shell-type那么 bash. |
| 工具过滤器 | TMUX_MCP_TOOLS那么 [security.tools],然后是拒绝模式,没有被拒绝的项目。 |
配置示例
[shell]
type = "zsh"
[ssh]
remote = "user@host"
[security]
enabled = true
allow_execute_command = true
allow_raw_mode = true
allow_send_keys = false
allow_kill = true
allow_create = true
allow_split = true
allow_rename = true
allow_move = true
allow_capture = true
allow_list = true
allowed_sockets = ["/tmp/tmux-mcp-agent.sock"]
allowed_sessions = ["workspace"]
allowed_panes = ["%1"]
allowed_buffer_paths = ["/srv/tmux-mcp-buffers"]
[security.command_filter]
mode = "allowlist"
patterns = ["^cargo ", "^git ", "^rg ", "^sed "]
[security.tools]
mode = "deny"
items = ["@raw-input"]
[tracking]
capture_initial_lines = 1000
capture_max_lines = 16000
completed_retention_minutes = 240
completed_max_entries = 1000
tracking_deadline_seconds = 600
[search]
streaming_threshold_bytes = 262144
安全选项
| 关键字 | 类型 | 默认值 | 描述 |
|---|---|---|---|
security.enabled |
布尔值 | true |
启用策略检查。设为 false 只有当你想绕过每一项策略检查时。 |
security.allow_execute_command |
布尔值 | true |
允许 execute-command 和 get-command-result. |
security.allow_raw_mode |
布尔值 | true |
允许 execute-command 与 rawMode=true,它发送命令时没有跟踪标记。 |
security.allow_send_keys |
布尔值 | true |
允许使用原始输入工具: send-keys, send-hex, paste-text,以及特殊密钥助手。 |
security.allow_kill |
布尔值 | true |
允许 kill-session, kill-window, kill-pane,以及 detach-client. |
security.allow_create |
布尔值 | true |
允许 create-session 和 create-window. |
security.allow_split |
布尔值 | true |
允许 split-pane. |
security.allow_rename |
布尔值 | true |
允许使用会话、窗口和窗格重命名工具。 |
security.allow_move |
布尔值 | true |
允许使用聚焦、调整大小、缩放、布局、连接、打断、交换、移动和同步窗格工具。 |
security.allow_capture |
布尔值 | true |
允许 capture-pane 以及tmux缓冲区读、写和搜索工具。缓冲区文件操作是此捕获界面的一部分。 |
security.allow_list |
布尔值 | true |
允许使用会话、窗口、窗格、客户端、缓冲区和当前会话列表工具。 |
security.allowed_sockets |
string array或unset | unset | 设置后,每个工具和资源请求的有效套接字必须与这些路径之一完全匹配。 |
security.allowed_sessions |
string array或unset | unset | 设置后,会话范围的操作仅限于列表中的确切tmux会话ID或名称。 |
security.allowed_panes |
string array或unset | unset | 设置后,直接窗格操作仅限于列出的窗格ID。 |
security.allowed_buffer_paths |
string数组或unset | unset | 允许的规范目录 save-buffer 和 load-buffer.未设置时,路径必须是相对的,并位于本地临时目录下 tmux-mcp-buffers/ 目录,或 /tmp/tmux-mcp-buffers/ 通过SSH。空列表拒绝所有缓冲区文件路径。 |
security.command_filter.mode |
off, allowlist, denylist |
off |
Regex命令过滤模式。 |
security.command_filter.patterns |
字符串数组 | [] |
命令过滤器使用的正则表达式模式。 |
security.tools.mode |
deny, allow |
deny |
运行时工具表面过滤器模式。 |
security.tools.items |
字符串数组 | [] |
精确的工具名称或组,例如 @raw-input. |
security.command_filter 检查每个非空shell语句 execute-command, send-keys (字面和非字面), paste-text, set-buffer, append-buffer,并将解码后的字节传递给 send-hex.它拆分为非上市 ;, |, &,和换行符,然后递归检查命令替换、进程替换、子shell和大括号组。它拒绝接受无法安全分析的壳体形式,包括ANSI-C $'...' 引用和shell -c 包装纸。它不会筛选特殊的密钥助手。对于硬边界,请在运行时禁用原始输入工具或将其编译出来。
跟踪选项
| 密钥 | 默认值 | 描述 |
|---|---|---|
tracking.capture_initial_lines |
1000 |
刷新正在运行的命令的部分输出时捕获的窗格行。 |
tracking.capture_max_lines |
16000 |
在提取人类可见的开始/完成标记之间的最终输出时捕获的最大窗格线。 |
tracking.capture_backoff_factor |
2 |
已接受配置兼容性。侧信道完成不再使用捕获退避。 |
tracking.completed_retention_minutes |
240 |
内存中保留的已完成命令历史记录的年龄限制。 |
tracking.completed_max_entries |
1000 |
内存中保留的最大已完成命令条目数。设为 0 禁用条目计数修剪,仅依赖保留时间。 |
tracking.tracking_deadline_seconds |
600 |
侧通道监视器等待多长时间 tmux wait-for 标记前 tracking_error. |
搜索选项
| 密钥 | 默认值 | 描述 |
|---|---|---|
search.streaming_threshold_bytes |
262144 |
缓冲区大小阈值,其中搜索通过临时文件进行流式传输,而不是将完整的缓冲区文本加载到一个字符串中进行搜索 |
安全强化
默认情况下,策略强制已启用,但允许:
- 全部粗糙
allow_*大门是true. command_filter.mode是off.allowed_sockets,allowed_sessions,allowed_panes,以及allowed_buffer_paths未设置。缓冲区文件操作仍然仅限于默认的临时目录沙盒。[security.tools]是拒绝模式,没有被拒绝的项目。
该默认值便于本地实验,但它不是沙箱。
使用隔离的tmux套接字
tmux -S /tmp/tmux-mcp-agent.sock -f /dev/null new-session -d -s workspace
tmux-mcp-rs --socket /tmp/tmux-mcp-agent.sock --config config.toml
[security]
allowed_sockets = ["/tmp/tmux-mcp-agent.sock"]
当 allowed_sockets 如果已设置,则没有显式套接字的调用仍将解析为进程默认套接字,并且必须与allowlist匹配。
在运行时删除原始输入
[security]
allow_send_keys = false
[security.tools]
mode = "deny"
items = ["@raw-input"]
当shell输入应该通过时使用此选项 execute-command 因此,命令过滤和命令结果跟踪仍然是核心。
仅显示读取工具和跟踪的命令执行
[security.tools]
mode = "allow"
items = ["@read", "execute-command"]
@read 包括 get-command-result,列出工具、捕获工具、缓冲区读取/搜索工具,以及 socket-for-path.
覆盖一个工序的刀具表面
TMUX_MCP_TOOLS=send-keys,paste-text tmux-mcp-rs
TMUX_MCP_TOOLS=deny:@raw-input tmux-mcp-rs
TMUX_MCP_TOOLS=allow:@read,execute-command tmux-mcp-rs
编译原始输入工具
默认的Cargo功能集包括 interactive 和 special-keys.
interactive寄存器send-keys,send-hex,以及paste-text.special-keys寄存器send-cancel,send-eof,send-escape,send-enter,send-tab,send-backspace,send-up,send-down,send-left,send-right,send-page-up,send-page-down,send-home,以及send-end.
禁用这些功能以从二进制文件中删除工具:
# Filtered-only build: execute-command is the only shell-input path.
cargo build --release --no-default-features --features rayon,rapidfuzz
# Keep raw keystrokes but remove special-key helpers.
cargo build --release --no-default-features --features rayon,rapidfuzz,interactive
execute-command 始终已注册,并仍受 security.command_filter.
MCP工具参考
工具可用性取决于Cargo功能和运行时策略。运行时被拒绝的工具将从通告的MCP工具列表中删除,并在调用时被拒绝。
工具组
| 组 | 工具 |
|---|---|
@all |
所有已知的工具都被编译成二进制文件。 |
@read |
socket-for-path,列出/查找工具, capture-pane缓冲区读取/搜索工具,以及 get-command-result. |
@socket |
socket-for-path. |
@list |
list-sessions, find-session, list-windows, list-panes, list-clients, list-buffers, get-current-session. |
@execute |
execute-command, get-command-result. |
@capture |
capture-pane. |
@buffer-read |
list-buffers, show-buffer, search-buffer, subsearch-buffer. |
@buffer-write |
save-buffer, load-buffer, delete-buffer, set-buffer, append-buffer, rename-buffer. |
@create |
create-session, create-window. |
@split |
split-pane. |
@rename |
rename-session, rename-window, rename-pane. |
@move |
move-window, select-window, select-pane, resize-pane, zoom-pane, select-layout, join-pane, break-pane, swap-pane, set-synchronize-panes. |
@kill |
kill-session, kill-window, kill-pane, detach-client. |
@interactive |
send-keys, send-hex, paste-text. |
@special-keys |
send-cancel, send-eof, send-escape, send-enter, send-tab, send-backspace, send-up, send-down, send-left, send-right, send-page-up, send-page-down, send-home, send-end. |
@raw-input |
全部 @interactive 和 @special-keys 工具。 |
按任务列出的工具
| 任务 | 工具 |
|---|---|
| 插座实用程序 | socket-for-path 导出确定性 /tmp/<hash>.sock 项目路径中的路径。 |
| 会话管理 | list-sessions, find-session, create-session, kill-session, get-current-session, rename-session. |
| 窗口管理 | list-windows, create-window, kill-window, rename-window, move-window, select-window, select-layout, set-synchronize-panes. |
| 窗格管理 | list-panes, split-pane, kill-pane, rename-pane, capture-pane, select-pane, resize-pane, zoom-pane, join-pane, break-pane, swap-pane. |
| 命令执行 | execute-command 回报 commandId + resourceUri;更喜欢 resources/subscribe 然后继续阅读 resources/updated,或 get-command-result 与 waitMs. |
| 客户管理 | list-clients, detach-client. |
| 缓冲器检查 | list-buffers, show-buffer, search-buffer, subsearch-buffer. |
| 缓冲液突变 | save-buffer, load-buffer, delete-buffer, set-buffer, append-buffer, rename-buffer. |
| 原始输入 | send-keys, paste-text, send-hex, send-cancel, send-eof, send-escape, send-enter, send-tab, send-backspace, send-up, send-down, send-left, send-right, send-page-up, send-page-down, send-home, send-end. |
更喜欢 execute-command 使用资源订阅/读取(或 get-command-result + waitMs)用于非交互式命令。每个窗格都有跟踪的命令队列。使用 capture-pane 只为实时进步;不要将窗格“完成”标记视为权威。仅将原始输入工具用于提示、REPL、编辑器、寻呼机和TUI,而不是在该窗格上运行跟踪命令时使用。
跟踪命令快照使用情况 schemaVersion: 1 目前正在通过 queued, running那么 completed, failed,或 tracking_error。该方案还保留 cancelled,但当前跟踪器不会发出它。正常的跟踪命令会拒绝嵌入的换行符、未加引号的shell注释标记(#),以及未报价的后台操作员(&)因为这些表格可以绕过跟踪尾声。集 rawMode=true 或 noEnter=true 仅当您有意禁用侧通道完成跟踪时;这些记录仍然存在 running.
show-buffer 默认情况下最多读取65536个字节。 search-buffer 默认为每个缓冲区40个上下文字节、50个匹配项和65536个扫描字节;它返回字节偏移量,并在结果被截断时恢复游标。文字和正则表达式搜索始终可用。模糊匹配和相似性得分要求 rapidfuzz 货物功能,默认启用。
MCP资源参考
服务器、窗格、窗口、会话和客户端资源反映了服务器的默认套接字。被跟踪的命令资源保留其原始记录的有效套接字 execute-command,包括每个刀具插座的超控。资源由当前安全策略动态枚举和过滤。
仅支持跟踪命令结果资源 resources/subscribe;在a之后读取资源 notifications/resources/updated 活动。其他资源URI提供按需快照。
| URI | 描述 |
|---|---|
tmux://server/info |
带有默认套接字和SSH上下文的JSON。 |
tmux://pane/{paneId} |
窗格中的最后200行以纯文本形式显示。 |
tmux://pane/{paneId}/info |
JSON格式的窗格元数据。 |
tmux://pane/{paneId}/tail/{lines} |
将窗格中的N行作为纯文本。 |
tmux://pane/{paneId}/tail/{lines}/ansi |
使用ANSI颜色从窗格中画出N条尾线。 |
tmux://window/{windowId}/info |
窗口元数据为JSON。 |
tmux://session/{sessionId}/tree |
会话、窗口和窗格快照为JSON。 |
tmux://clients |
tmux客户端为JSON格式。 |
tmux://command/{commandId}/result |
跟踪命令状态和输出。 |
远程和套接字工作流
远程SSH
使用 --ssh 在另一台机器上运行tmux命令。SSH身份验证必须是非交互式的,例如基于代理或密钥的登录。
tmux-mcp-rs --ssh "user@host"
在目标之前传递SSH选项:
tmux-mcp-rs --ssh "-i ~/.ssh/key user@host"
连接字符串使用shell单词规则进行拆分。目标应该是最后一个令牌。服务器在将远程tmux命令发送到SSH之前会引用它,当可以访问远程tmux时,tmux版本检查会应用于远程tmux。
远程加隔离插座
在远程主机上创建专用tmux服务器:
ssh user@host 'tmux -S /tmp/tmux-mcp-agent.sock -f /dev/null new-session -d -s workspace'
针对该远程套接字启动本地MCP服务器:
tmux-mcp-rs --ssh "user@host" --socket /tmp/tmux-mcp-agent.sock
需要时直接从外壳连接:
ssh -t user@host 'tmux -S /tmp/tmux-mcp-agent.sock attach -t workspace'
插座隔离
使用 --socket 或 TMUX_MCP_SOCKET 要在一个tmux服务器上保留一个代理:
tmux-mcp-rs --socket /tmp/tmux-mcp-agent.sock
TMUX_MCP_SOCKET=/tmp/tmux-mcp-agent.sock tmux-mcp-rs
在MCP客户端启动之前,如果您想要一个人类可见的工作区,请预先创建会话:
tmux -S /tmp/tmux-mcp-agent.sock -f /dev/null new-session -d -s workspace
TMUX_MCP_SOCKET=/tmp/tmux-mcp-agent.sock tmux-mcp-rs
Docker和套接字
GHCR映像包括tmux 3.x,默认为 独立的 容器内的会话(docker exec … tmux attach).仅在Linux上,您可以挂载主机套接字,以便容器MCP服务器驱动主机tmux服务器——请参阅 安装→ 码头工人 和 包装/README.mdmacOS/Windows上的Docker Desktop不是可靠的主机套接字路径;当您需要轻松的本地协同连接时,请使用本机安装。
代理工作流模式
集成测试涵盖了以下tmux工作流:
| 图案 | 刀具表面 |
|---|---|
| ID优先定位 | list-windows, list-panes, rename-window. |
| 每个会话的任务布局 | create-session, create-window, split-pane, rename-pane,列出工具。 |
| 有状态的shell上下文 | send-keys, capture-pane. |
| 连续输出窗格 | send-keys, capture-pane. |
| 交互式提示自动化 | send-keys, capture-pane. |
| 交互式中断 | send-cancel, send-eof, capture-pane. |
| 同步窗格广播 | set-synchronize-panes, send-keys, capture-pane. |
| 缓冲区切换和搜索 | list-buffers, show-buffer, save-buffer, delete-buffer, search-buffer, subsearch-buffer. |
| 窗格重新排列 | split-pane, select-layout, swap-pane, break-pane, join-pane. |
| 元数据和缩放 | 重命名工具, zoom-pane, resize-pane,窗格/窗口资源。 |
| 审核就绪上下文包 | execute-command, get-command-result, capture-pane. |
| 代理编排 | create-window, split-pane, execute-command, send-keys, capture-pane. |
对于面向代理的tmux工作流,请参阅:
tmux-buffer-explorer 使用tmux缓冲区作为大文本的外部搜索空间。当代理需要有界搜索和后续切片,而不是将整个缓冲区加载到上下文中时,它很有用。
发展
构建二进制文件:
cargo build --release
运行不需要tmux的单元测试:
cargo test --lib
cargo test --test cli
cargo test --test search
运行tmux支持的集成测试:
TMUX_MCP_INTEGRATION=1 cargo test --test integration
集成测试使用临时套接字创建隔离的tmux服务器,并在之后对其进行清理。
运行与CI相同的Rust检查:
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-targets
发布说明和发布包装详细信息实时发布 更改日志.md 和 docs/RELEASE.md.
注意事项和限制
- tmux拥有粘贴缓冲区,而此服务器在内存中保留跟踪的命令快照。
paste-text,set-buffer,append-buffer,并且大的保留命令输出仍然会消耗主机内存。跟踪的输出由以下内容限制capture_max_lines,但保留的字符串和单个行长度不受字节限制。 - 缓冲区搜索通过临时文件流式传输大缓冲区
search.streaming_threshold_bytes,但tmux缓冲区本身并不是按大小驱逐的。 - tmux行从制表符分隔的行中解析
-F输出。窗格标题、路径或类似字段内的文字选项卡可能会移动后面的字段,并产生格式错误或跳过的行。 paste-text使用括号内的粘贴标记。不支持括号粘贴的shell和程序可能会将嵌入的换行符视为Enter。在macOS上,默认/bin/bash3.2不支持现代括号粘贴行为;zsh或更新的bash对于不应该逐行提交的多行输入更安全。save-buffer写入tmux服务器文件系统,以及load-buffer从中读取。两者都受allow_capture,[security.tools],以及security.allowed_buffer_paths。在默认启用策略的情况下,调用者使用本地临时目录中的相对路径tmux-mcp-buffers/沙箱或/tmp/tmux-mcp-buffers/通过SSH;父遍历和规范或符号链接转义被拒绝。- 命令结果是套接字绑定的。
get-command-result必须使用与原始插座相同的有效插座execute-command电话。 - 跟踪命令完成使用专用tmux出口缓冲区+
wait-for信号,不可伪造的窗格滚动。可选的开始/完成行仅适用于人工/调试。 - 交互式
send-keys/paste-text在同一窗格上跟踪运行期间未定义;等待命令完成或使用另一个窗格。 - 端到端SSH行为是手动验证的,因为CI不提供远程主机。
源锚点
- CLI解析和启动行为: src/main.rs
- MCP工具、资源和服务器说明: src/server.rs
- 安全策略和工具组: src/security.rs
- 命令跟踪: src/commands.rs
- tmux套接字、SSH和进程包装器行为: src/tmux.rs
- 公共数据类型: src/types.rs
- CLI测试: tests/cli.rs
- 集成工作流程: 测试/集成.rs
- 缓冲区搜索测试: tests/search.rs
许可证
MIT许可证。看 许可证.
