Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
_Notes on upcoming releases will be added here_
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

### Documentation

**Grok CLI and Antigravity in the MCP install picker**

The MCP client picker now covers Grok CLI and Antigravity (Google's agy) alongside Claude, Codex, Gemini, and Cursor. Grok registers through its own `grok mcp add` verb (`~/.grok/config.toml`); Antigravity has no such verb, so its `mcpServers` snippet is pasted into `~/.gemini/config/mcp_config.json`. (#89)

## libtmux-mcp 0.1.0a16 (2026-07-04)

libtmux-mcp 0.1.0a16 raises the libtmux floor to 0.61.0, picking up libtmux 0.61.0's hardening of the tmux 3.7 patch line. The server runs cleanly against tmux 3.7a and 3.7b, and tmux 3.2a-3.6 keep working unchanged. The bump requires no server code or test changes.
Expand Down
57 changes: 50 additions & 7 deletions docs/_ext/widgets/mcp_install.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
"""MCP install picker widget: client x method x scope x cooldown matrix.

Each MCP client carries its own ``scopes`` tuple (Claude Code has three,
Claude Desktop has one, the rest have two). On top of that, every panel
exists in three **cooldown** modes — ``off`` (no extra flag), ``days``
(insert a ``--exclude-newer`` / ``--uploaded-prior-to`` flag with a
user-configurable day count), and ``bypass`` (skip any global uv
cooldown via ``--no-config`` / ``UV_NO_CONFIG``). Together these
produce 90 server-rendered panels (3 + 1 + 2 + 2 + 2 = 10 scopes,
times 3 methods, times 3 cooldown modes).
Claude Desktop and Antigravity have one, the rest have two). On top of
that, every panel exists in three **cooldown** modes — ``off`` (no extra
flag), ``days`` (insert a ``--exclude-newer`` / ``--uploaded-prior-to``
flag with a user-configurable day count), and ``bypass`` (skip any global
uv cooldown via ``--no-config`` / ``UV_NO_CONFIG``). Together these
produce 117 server-rendered panels (3 + 1 + 2 + 2 + 2 + 2 + 1 = 13
scopes, times 3 methods, times 3 cooldown modes).

Cooldown state is split across three orthogonal axes:
``DEFAULT_COOLDOWN_ENABLED`` (master on/off), ``DEFAULT_COOLDOWN_TYPE``
Expand Down Expand Up @@ -170,6 +170,30 @@ class Panel:
),
)

_GROK_SCOPES: tuple[Scope, ...] = (
Scope(
id="user",
label="User",
config_file="~/.grok/config.toml",
note=None,
),
Scope(
id="project",
label="Project",
config_file="./.grok/config.toml (in repo)",
note=None,
),
)

_ANTIGRAVITY_SCOPES: tuple[Scope, ...] = (
Scope(
id="global",
label="Global",
config_file="~/.gemini/config/mcp_config.json",
note=None,
),
)


CLIENTS: tuple[Client, ...] = (
Client(
Expand Down Expand Up @@ -202,6 +226,18 @@ class Panel:
kind="json",
scopes=_CURSOR_SCOPES,
),
Client(
id="grok",
label="Grok CLI",
kind="cli",
scopes=_GROK_SCOPES,
),
Client(
id="antigravity",
label="Antigravity",
kind="json",
scopes=_ANTIGRAVITY_SCOPES,
),
)


Expand Down Expand Up @@ -334,6 +370,13 @@ def _cli_body(client: Client, scope: Scope, method: Method, cooldown: Cooldown)
if client.id == "claude-code":
flag = "" if scope.id == "local" else f"--scope {scope.id} "
return f"claude mcp add tmux {flag}-- {tool_cmd}".replace(" ", " ")
# grok: ``grok mcp add --scope <user|project> <name> -- <cmd>`` writes
# both scopes itself (``~/.grok/config.toml`` / ``./.grok/config.toml``,
# TOML ``[mcp_servers.<name>]`` — same shape as Codex), so unlike Codex
# no manual-paste path is needed for project scope. Everything after
# ``--`` is handed to the server process verbatim.
if client.id == "grok":
return f"grok mcp add --scope {scope.id} tmux -- {tool_cmd}"
# codex: CLI doesn't write project scope; the project-scope panel
# uses the TOML body path (see ``_body_for``).
return f"codex mcp add tmux -- {tool_cmd}"
Expand Down
4 changes: 3 additions & 1 deletion docs/_widgets/mcp-install/widget.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
};

// Mirror of docs/_ext/widgets/mcp_install.py:DEFAULT_SCOPES. The prehydrate
// <head> script emits the same map; this duplicate is small enough (5
// <head> script emits the same map; this duplicate is small enough (7
// entries) that the cost of keeping them in sync beats reading the literal
// back out of the DOM. Update both when adding a client.
var DEFAULT_SCOPES = {
Expand All @@ -53,6 +53,8 @@
"codex": "user",
"gemini": "user",
"cursor": "project",
"grok": "user",
"antigravity": "global",
};

var DEFAULT_COOLDOWN_ENABLED = false;
Expand Down
30 changes: 29 additions & 1 deletion docs/clients.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ $ npx @modelcontextprotocol/inspector
| Codex CLI | `~/.codex/config.toml` (user) or `.codex/config.toml` (project, manual) | TOML |
| Gemini CLI | `~/.gemini/settings.json` (user) or `.gemini/settings.json` (project) | JSON |
| Cursor | `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global) | JSON |
| Grok CLI | `~/.grok/config.toml` (user) or `./.grok/config.toml` (project) | TOML |
| Antigravity | `~/.gemini/config/mcp_config.json` (global) | JSON |

## Local checkout (development)

Expand All @@ -49,7 +51,7 @@ $ claude mcp add \
```

<details>
<summary>Codex CLI / Gemini CLI / Cursor</summary>
<summary>Codex CLI / Gemini CLI / Grok CLI / Cursor / Antigravity</summary>

**Codex CLI:**

Expand All @@ -69,6 +71,16 @@ $ gemini mcp add \
run libtmux-mcp
```

**Grok CLI:**

```console
$ grok mcp add \
--scope user \
tmux -- \
uv --directory ~/work/python/libtmux-mcp \
run libtmux-mcp
```

**Cursor** — add to `~/.cursor/mcp.json`:

```json
Expand All @@ -85,6 +97,22 @@ $ gemini mcp add \
}
```

**Antigravity** — add to `~/.gemini/config/mcp_config.json`:

```json
{
"mcpServers": {
"tmux": {
"command": "uv",
"args": [
"--directory", "~/work/python/libtmux-mcp",
"run", "libtmux-mcp"
]
}
}
}
```

</details>

## Common pitfalls
Expand Down
10 changes: 4 additions & 6 deletions scripts/mcp_swap.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@
``~/.claude.json``, ``~/.codex/config.toml``,
``~/.gemini/settings.json``, ``~/.grok/config.toml`` (TOML
``mcp_servers``, same shape as Codex), and
``~/.gemini/antigravity/mcp_config.json`` (agy, JSON
``mcpServers``). The agy CLI may read a different profile from the
desktop app; only the profile path above is written. Workspace / project-local configs
``~/.gemini/config/mcp_config.json`` (agy / Antigravity CLI, JSON
``mcpServers`` — the shared-config file the CLI reads, sibling to the
``config.json`` it loads at startup). Workspace / project-local configs
(``$PWD/.cursor/mcp.json``, ``$PWD/.gemini/settings.json``,
per-project ``projects.<abs>.mcpServers`` entries inside
``~/.claude.json`` *are* recognised for Claude only) are NOT
Expand Down Expand Up @@ -227,9 +227,7 @@ class CLIInfo:
"agy": CLIInfo(
name="agy",
binary="agy",
config_path=(
pathlib.Path.home() / ".gemini" / "antigravity" / "mcp_config.json"
),
config_path=(pathlib.Path.home() / ".gemini" / "config" / "mcp_config.json"),
fmt="json",
),
}
Expand Down
Loading