Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
cab2190
mcp(feat[foundation]): Add MCP server foundation with FastMCP
tony Mar 8, 2026
45e23d3
mcp(feat[tools]): Add 25 MCP tools for tmux control
tony Mar 8, 2026
8c35b32
mcp(feat[resources]): Add tmux:// URI resources for hierarchy browsing
tony Mar 8, 2026
a883e7e
mcp(test): Add 49 tests for MCP tools, resources, and utilities
tony Mar 8, 2026
fae8ebf
mcp(fix[_utils]): Add tmux_bin to cache key and is_alive eviction
tony Mar 8, 2026
c7d75ff
mcp(fix[pane_tools]): Replace deprecated resize_pane with state-aware…
tony Mar 8, 2026
490e53a
mcp(fix[pane_tools]): Use pane.kill() instead of raw cmd
tony Mar 8, 2026
29f3ad8
mcp(fix[window_tools]): Use Window.resize() instead of raw cmd
tony Mar 8, 2026
e4d23b5
mcp(fix[window_tools,session_tools]): Validate direction parameters
tony Mar 8, 2026
2eed379
mcp(fix[option_tools]): Validate scope parameter
tony Mar 8, 2026
5955533
mcp(fix[hierarchy]): Remove broad try/except, let FastMCP handle errors
tony Mar 8, 2026
84eb7ad
mcp(fix[_utils]): Log unexpected errors in handle_tool_errors
tony Mar 8, 2026
a9c9c61
mcp(feat[_utils]): Add _apply_filters() helper for QueryList filtering
tony Mar 8, 2026
1dee773
mcp(feat[list_tools]): Add filtering and scope broadening to list tools
tony Mar 8, 2026
ef0ab7d
mcp(fix[_utils]): Accept filters as JSON string for MCP client compat
tony Mar 8, 2026
215c8b4
mcp(fix[pane_tools]): Query tmux for zoom state instead of missing attr
tony Mar 21, 2026
7dfedbe
mcp(fix[window_tools]): Split from specified pane, not active pane
tony Mar 21, 2026
462db9c
mcp(fix[option_tools]): Reject target without scope instead of ignoring
tony Mar 21, 2026
1c1a6fa
mcp(fix[pane_tools]): Use tmux-level reset instead of sending keystrokes
tony Mar 21, 2026
b793fec
mcp(fix[docs]): Use %1 not %%1 for pane ID examples in docstrings
tony Mar 21, 2026
c8ae043
mcp(fix[_utils]): Add thread safety to server cache and fix invalidation
tony Mar 21, 2026
57828c8
mcp(fix[hierarchy]): Use ResourceError instead of ValueError
tony Mar 21, 2026
bf056a5
mcp(fix[server_tools]): Avoid redundant is_alive() subprocess calls
tony Mar 21, 2026
13e2032
mcp(fix): Guard entrypoint against missing fastmcp dependency
tony Mar 21, 2026
6088e7f
mcp(feat[tools,resources]): Add complete MCP annotations and titles
tony Mar 21, 2026
d08261d
mcp(feat[server]): Add version and expand instructions
tony Mar 21, 2026
246cbfd
py(deps[mcp]): Pin fastmcp to >=3.1.0,<4.0.0
tony Mar 21, 2026
fc4f7d7
mcp(feat[pane_tools,window_tools]): Add session_id to pane tools and …
tony Mar 21, 2026
cbb548f
mcp(fix[docs]): Clarify parameter descriptions from tmux source
tony Mar 21, 2026
38f6a8e
mcp(feat[tools]): Use Literal types for enum parameters in JSON schema
tony Mar 21, 2026
4175ac1
mcp(feat[models]): Add Pydantic output models for MCP tools
tony Mar 21, 2026
2d629eb
mcp(refactor[tools,resources]): Return Pydantic models instead of JSO…
tony Mar 21, 2026
a4d8d14
mcp(feat[server]): Add content-vs-metadata guidance to server instruc…
tony Mar 21, 2026
96ae620
mcp(docs[tools]): Clarify metadata-only scope in list tool descriptions
tony Mar 21, 2026
97abdcf
mcp(feat[pane_tools]): Add search_panes tool for content search
tony Mar 21, 2026
9492e2a
mcp(feat[server,models]): Add agent self-awareness via TMUX_PANE dete…
tony Mar 21, 2026
acdbf70
mcp(fix[pane_tools]): Correct send_keys destructiveHint to False
tony Mar 21, 2026
b72f4df
mcp(refactor[tools]): Extract annotation constants and add safety tie…
tony Mar 21, 2026
9e9e561
mcp(feat[middleware]): Add SafetyMiddleware to gate tools by tier
tony Mar 21, 2026
44b58fd
mcp(feat[server]): Include safety level in server instructions
tony Mar 21, 2026
b4b8231
mcp(fix[tools]): Require explicit target for destructive tools
tony Mar 21, 2026
53650e6
mcp(fix[pane_tools]): Make search_panes result ordering deterministic
tony Mar 21, 2026
1b643e0
fix(Pane[reset]): Split reset into separate send-keys and clear-histo…
tony Mar 21, 2026
b47634b
mcp(feat[resources]): Add socket_name query param to all resources
tony Mar 21, 2026
35e43eb
mcp(test[resources]): Add integration tests via FastMCP Client
tony Mar 21, 2026
16ac3bd
mcp(feat[pane_tools]): Add wait_for_text tool for terminal automation
tony Mar 21, 2026
de621ec
mcp(fix[safety]): Harden search, destructive tools, and middleware
tony Mar 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ lint = [
"mypy",
]

[project.optional-dependencies]
mcp = [
"fastmcp>=3.1.0,<4.0.0; python_version >= '3.10'",
]

[project.scripts]
libtmux-mcp = "libtmux.mcp:main"

[project.entry-points.pytest11]
libtmux = "libtmux.pytest_plugin"

Expand Down
20 changes: 20 additions & 0 deletions src/libtmux/mcp/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"""libtmux MCP server - programmatic tmux control for AI agents."""

from __future__ import annotations


def main() -> None:
"""Entry point for the libtmux MCP server."""
try:
from libtmux.mcp.server import run_server
except ImportError:
import sys

print(
"libtmux MCP server requires fastmcp. "
"Install with: pip install libtmux[mcp]",
file=sys.stderr,
)
raise SystemExit(1) from None

run_server()
7 changes: 7 additions & 0 deletions src/libtmux/mcp/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""Support ``python -m libtmux.mcp``."""

from __future__ import annotations

from libtmux.mcp import main

main()
Loading
Loading