Skip to content

Commit fc4f7d7

Browse files
committed
mcp(feat[pane_tools,window_tools]): Add session_id to pane tools and split_window
why: All 7 pane tools and `split_window` accepted `session_name` but not `session_id`, while session/window-level tools consistently accept both. The `_resolve_pane()` and `_resolve_window()` helpers already support `session_id` — it just wasn't exposed in the tool signatures. what: - Add `session_id: str | None = None` parameter to send_keys, capture_pane, resize_pane, kill_pane, set_pane_title, get_pane_info, clear_pane, and split_window - Pass through to _resolve_pane()/_resolve_window() - Improve capture_pane start/end and split_window size descriptions (verified against tmux C source: cmd-capture-pane.c, cmd-split-window.c) - Clarify suppress_history as libtmux abstraction (space prefix)
1 parent 246cbfd commit fc4f7d7

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

src/libtmux/mcp/tools/pane_tools.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def send_keys(
2121
keys: str,
2222
pane_id: str | None = None,
2323
session_name: str | None = None,
24+
session_id: str | None = None,
2425
window_id: str | None = None,
2526
enter: bool = True,
2627
literal: bool = False,
@@ -37,14 +38,17 @@ def send_keys(
3738
Pane ID (e.g. '%1').
3839
session_name : str, optional
3940
Session name for pane resolution.
41+
session_id : str, optional
42+
Session ID (e.g. '$1') for pane resolution.
4043
window_id : str, optional
4144
Window ID for pane resolution.
4245
enter : bool
4346
Whether to press Enter after sending keys. Default True.
4447
literal : bool
4548
Whether to send keys literally (no tmux interpretation). Default False.
4649
suppress_history : bool
47-
Whether to suppress shell history. Default False.
50+
Whether to suppress shell history by prepending a space.
51+
Only works in shells that support HISTCONTROL. Default False.
4852
socket_name : str, optional
4953
tmux socket name.
5054
@@ -58,6 +62,7 @@ def send_keys(
5862
server,
5963
pane_id=pane_id,
6064
session_name=session_name,
65+
session_id=session_id,
6166
window_id=window_id,
6267
)
6368
pane.send_keys(
@@ -73,6 +78,7 @@ def send_keys(
7378
def capture_pane(
7479
pane_id: str | None = None,
7580
session_name: str | None = None,
81+
session_id: str | None = None,
7682
window_id: str | None = None,
7783
start: int | None = None,
7884
end: int | None = None,
@@ -86,10 +92,13 @@ def capture_pane(
8692
Pane ID (e.g. '%1').
8793
session_name : str, optional
8894
Session name for pane resolution.
95+
session_id : str, optional
96+
Session ID (e.g. '$1') for pane resolution.
8997
window_id : str, optional
9098
Window ID for pane resolution.
9199
start : int, optional
92-
Start line number (negative for scrollback history).
100+
Start line number. 0 is the first visible line. Negative values
101+
reach into scrollback history (e.g. -100 for last 100 lines).
93102
end : int, optional
94103
End line number.
95104
socket_name : str, optional
@@ -105,6 +114,7 @@ def capture_pane(
105114
server,
106115
pane_id=pane_id,
107116
session_name=session_name,
117+
session_id=session_id,
108118
window_id=window_id,
109119
)
110120
lines = pane.capture_pane(start=start, end=end)
@@ -115,6 +125,7 @@ def capture_pane(
115125
def resize_pane(
116126
pane_id: str | None = None,
117127
session_name: str | None = None,
128+
session_id: str | None = None,
118129
window_id: str | None = None,
119130
height: int | None = None,
120131
width: int | None = None,
@@ -129,6 +140,8 @@ def resize_pane(
129140
Pane ID (e.g. '%1').
130141
session_name : str, optional
131142
Session name for pane resolution.
143+
session_id : str, optional
144+
Session ID (e.g. '$1') for pane resolution.
132145
window_id : str, optional
133146
Window ID for pane resolution.
134147
height : int, optional
@@ -156,6 +169,7 @@ def resize_pane(
156169
server,
157170
pane_id=pane_id,
158171
session_name=session_name,
172+
session_id=session_id,
159173
window_id=window_id,
160174
)
161175
if zoom is not None:
@@ -175,6 +189,7 @@ def resize_pane(
175189
def kill_pane(
176190
pane_id: str | None = None,
177191
session_name: str | None = None,
192+
session_id: str | None = None,
178193
window_id: str | None = None,
179194
socket_name: str | None = None,
180195
) -> str:
@@ -186,6 +201,8 @@ def kill_pane(
186201
Pane ID (e.g. '%1').
187202
session_name : str, optional
188203
Session name for pane resolution.
204+
session_id : str, optional
205+
Session ID (e.g. '$1') for pane resolution.
189206
window_id : str, optional
190207
Window ID for pane resolution.
191208
socket_name : str, optional
@@ -201,6 +218,7 @@ def kill_pane(
201218
server,
202219
pane_id=pane_id,
203220
session_name=session_name,
221+
session_id=session_id,
204222
window_id=window_id,
205223
)
206224
pid = pane.pane_id
@@ -213,6 +231,7 @@ def set_pane_title(
213231
title: str,
214232
pane_id: str | None = None,
215233
session_name: str | None = None,
234+
session_id: str | None = None,
216235
window_id: str | None = None,
217236
socket_name: str | None = None,
218237
) -> str:
@@ -226,6 +245,8 @@ def set_pane_title(
226245
Pane ID (e.g. '%1').
227246
session_name : str, optional
228247
Session name for pane resolution.
248+
session_id : str, optional
249+
Session ID (e.g. '$1') for pane resolution.
229250
window_id : str, optional
230251
Window ID for pane resolution.
231252
socket_name : str, optional
@@ -241,6 +262,7 @@ def set_pane_title(
241262
server,
242263
pane_id=pane_id,
243264
session_name=session_name,
265+
session_id=session_id,
244266
window_id=window_id,
245267
)
246268
pane.set_title(title)
@@ -251,6 +273,7 @@ def set_pane_title(
251273
def get_pane_info(
252274
pane_id: str | None = None,
253275
session_name: str | None = None,
276+
session_id: str | None = None,
254277
window_id: str | None = None,
255278
socket_name: str | None = None,
256279
) -> str:
@@ -262,6 +285,8 @@ def get_pane_info(
262285
Pane ID (e.g. '%1').
263286
session_name : str, optional
264287
Session name for pane resolution.
288+
session_id : str, optional
289+
Session ID (e.g. '$1') for pane resolution.
265290
window_id : str, optional
266291
Window ID for pane resolution.
267292
socket_name : str, optional
@@ -277,6 +302,7 @@ def get_pane_info(
277302
server,
278303
pane_id=pane_id,
279304
session_name=session_name,
305+
session_id=session_id,
280306
window_id=window_id,
281307
)
282308
return json.dumps(_serialize_pane(pane))
@@ -286,6 +312,7 @@ def get_pane_info(
286312
def clear_pane(
287313
pane_id: str | None = None,
288314
session_name: str | None = None,
315+
session_id: str | None = None,
289316
window_id: str | None = None,
290317
socket_name: str | None = None,
291318
) -> str:
@@ -297,6 +324,8 @@ def clear_pane(
297324
Pane ID (e.g. '%1').
298325
session_name : str, optional
299326
Session name for pane resolution.
327+
session_id : str, optional
328+
Session ID (e.g. '$1') for pane resolution.
300329
window_id : str, optional
301330
Window ID for pane resolution.
302331
socket_name : str, optional
@@ -312,6 +341,7 @@ def clear_pane(
312341
server,
313342
pane_id=pane_id,
314343
session_name=session_name,
344+
session_id=session_id,
315345
window_id=window_id,
316346
)
317347
pane.reset()

src/libtmux/mcp/tools/window_tools.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def list_panes(
8787
def split_window(
8888
pane_id: str | None = None,
8989
session_name: str | None = None,
90+
session_id: str | None = None,
9091
window_id: str | None = None,
9192
window_index: str | None = None,
9293
direction: str | None = None,
@@ -100,17 +101,20 @@ def split_window(
100101
Parameters
101102
----------
102103
pane_id : str, optional
103-
Pane ID to split from. If given, the pane's window is used.
104+
Pane ID to split from. If given, splits adjacent to this pane.
104105
session_name : str, optional
105106
Session name.
107+
session_id : str, optional
108+
Session ID (e.g. '$1').
106109
window_id : str, optional
107110
Window ID (e.g. '@1').
108111
window_index : str, optional
109112
Window index within the session.
110113
direction : str, optional
111114
Split direction: 'above', 'below', 'left', or 'right'.
112115
size : str or int, optional
113-
Size of the new pane (percentage or line count).
116+
Size of the new pane. Use a string with '%%' suffix for
117+
percentage (e.g. '50%%') or an integer for lines/columns.
114118
start_directory : str, optional
115119
Working directory for the new pane.
116120
shell : str, optional
@@ -149,6 +153,7 @@ def split_window(
149153
window_id=window_id,
150154
window_index=window_index,
151155
session_name=session_name,
156+
session_id=session_id,
152157
)
153158
new_pane = window.split(
154159
direction=pane_dir,
@@ -257,7 +262,10 @@ def select_layout(
257262
Parameters
258263
----------
259264
layout : str
260-
Layout name (e.g. 'even-horizontal', 'tiled') or custom layout string.
265+
Layout name or custom layout string. Built-in layouts:
266+
'even-horizontal', 'even-vertical', 'main-horizontal',
267+
'main-horizontal-mirrored', 'main-vertical',
268+
'main-vertical-mirrored', 'tiled'.
261269
window_id : str, optional
262270
Window ID (e.g. '@1').
263271
window_index : str, optional

0 commit comments

Comments
 (0)