Skip to main content
Glama

Claude Code × Antigravity + Codex + Copilot + Cursor + Grok + Kimi — MCP Bridge

Drive six external coding CLIs — Google's Antigravity (Gemini 3.8 Flash), OpenAI Codex, the GitHub Copilot CLI, Cursor, and the two experimental newcomers Grok Build and Kimi Code — as sub-agents inside Claude Code. Text answers, image generation, real repo work, and parallel swarms, on quota you already pay for.

CI PyPI PyPI Downloads License: MIT Python 3.10+ MCP server Glama agy 1.1.25 verified codex 0.149.1 verified copilot 1.0.80 verified cursor 2026.07.23 verified grok 1.0.3 unverified kimi 0.29.1 unverified platform Sponsor


One MCP server, six backends — four verified, two experimental. It exposes Google Antigravity, OpenAI Codex, the GitHub Copilot CLI, Cursor, and now xAI's Grok Build and Moonshot's Kimi Code to Claude Code as clean MCP tools so you can delegate work to a different model family mid-task — without leaving your terminal, and on the subscriptions you already have. Each backend is independent: install one, or all six.

  • 🛰️ Antigravity (agy, Gemini 3.8 Flash High). Fast, cheap tool-calling — and the only backend with an image model. Its headless print mode (agy -p) historically had a stdout bug: it wrote the answer to the controlling terminal instead of its stdout, so anything capturing stdout got nothing (and, under a TUI, agy's text leaked into the host's prompt). agy 1.0.15 fixed this on Windows-p now writes the clean answer to stdout — so the bridge prefers stdout and falls back to reading agy's own transcript files only when stdout is empty (older agy, non-Windows, or --sandbox runs). It still detaches agy from the terminal so older versions can't leak.

  • 🤖 Codex (codex exec, OpenAI). A strong reasoner for real code/repo work. It writes its final message straight to a file the bridge asks for (no scraping), supports model selection, and has a real, enforced sandbox.

  • 🐙 Copilot (copilot -p, GitHub). GitHub's agentic coder. Stdout-native like Codex (-s prints just the answer), with model selection (--model), a best-effort tool/path permission knob, and a deterministic resume mechanism (the bridge sets each session's UUID itself).

  • ✳️ Cursor (cursor-agent -p, Cursor). Cursor's agentic coder, with the widest model menu — GPT, Claude, Grok, and Composer via --model (validated against cursor-agent models). Stdout-native like Codex/Copilot (--output-format text prints just the answer), an agent-enforced sandbox (read-only via --mode ask), and a deterministic resume mechanism (the bridge mints each chat's id itself via create-chat). No image model.

  • 🧪 Grok Build (grok -p, xAI) — EXPERIMENTAL. xAI's terminal coding agent, and the only backend besides Codex with a real OS sandbox — though only on Linux/macOS. Stdout-native (--output-format json returns the answer and the session id), with -r resume, streaming-json for watch mode, and full swarm support. Never verified end-to-end — see below.

  • 🌙 Kimi Code (kimi -p, Moonshot) — EXPERIMENTAL. Moonshot's terminal coding agent (Kimi K2 family). Stdout-native (--output-format text), resumes per working directory (-c). No sandbox — print mode auto-executes every tool, like Antigravity. Never verified end-to-end — see below.

They share the same niceties: a *_continue to resume a thread, a live "watch" window to see the agent work, a unified agent_swarm that runs many tasks in parallel across all backends at once, and *_status diagnostics that spend no quota. (Kimi is the one exception: no watch or swarm support yet — see Experimental backends.)

IMPORTANT

Grok Build and Kimi Code ship unverified, and I need your help. I don't have a Grok or Kimi subscription, so no authenticated round-trip has ever run against either backend. Everything up to each CLI's auth wall is verified live — flag surface, error shapes, model list, on-disk layout — but everything behind it comes from vendor docs and could be wrong. If you have either subscription, one issue from the verification template is the single most useful contribution you can make. Even confirming one checkbox helps. Full detail →

WARNING

This runs unsandboxed code with your privileges. agy -p auto-executes its tools (read/write files, run shell commands, reach the network) with no usable approval gate — its --sandbox blocks only shell commands, leaving file writes and network egress wide open. codex exec also runs autonomously, but its sandbox flag (default read-only) is a real, enforced boundary. copilot -p runs headless with --allow-all-tools; its sandbox maps to best-effort tool/path permissions (read-only denies the local write/shell tools) — safer than agy, but not an OS sandbox like Codex's. cursor-agent -p runs headless with --trust (and --force for writes); its sandbox is agent-enforced (read-only = --mode ask, which makes the write/shell tools unavailable) — best-effort like Copilot, not an OS sandbox. grok -p runs headless with --always-approve; its sandbox maps to a real OS profile (Landlock/Seatbelt) — but only on Linux and macOS, and on Windows grok silently continues without enforcement, so read-only there rests on an agent-enforced tool allowlist. kimi -p has no sandbox at all and auto-executes every tool, like agy. In all six cases the workspace argument is a starting context, not a security boundary. Only use these with trusted prompts on trusted content; for real isolation, run the bridge inside a container or VM. Full details →

Why you'd want this

🧠 Second opinion

Ask a different model family — Gemini or GPT — mid-task without switching tools.

🎨 Image generation

Have Gemini draw an image and get the saved file back — no extra API key or image tool.

🛠️ Real coding sub-agent

Hand a focused repo task to Codex with a real workspace-write sandbox.

💸 Cheap delegation

Burn Antigravity / Codex quota on grunt work instead of Claude tokens.

🐝 Parallel fan-out

Run N tasks at once, mixing Gemini and Codex workers in a single swarm.

📁 Cross-repo reads

Point a worker at another project directory and let it read/answer there.

🔌 Zero new auth

Piggybacks the logins you already did — no keys for the bridge to manage.

Related MCP server: mcp-cli-tools

The backends at a glance

The bridge normalizes every CLI into the same shape, but they differ where it matters. Pick per task. The four verified backends first; the two experimental ones follow.

🛰️ Antigravity (agy)

🤖 Codex (codex exec)

🐙 Copilot (copilot -p)

✳️ Cursor (cursor-agent -p)

Model

Selectable via model (agy's --model); Gemini 3.8 Flash (High) default (see Model & auth)

Selectable via model (codex's -m)

Selectable via model (--model)

Selectable via model (--model), validated against cursor-agent models

Best at

Fast, cheap tool-calling; quick answers

Heavier reasoning; real code/repo work

Agentic coding; real code/repo work

Agentic coding; wide model menu (GPT/Claude/Grok/Composer)

Image generation

antigravity_image (+ antigravity_image_swarm)

❌ no image model

❌ no image model

❌ no image model

Sandbox

❌ no real boundary (--sandbox blocks only shell); ⚠️ opt-in plan=True blocks writes/shell, agent-enforced

✅ real, enforced: read-only / workspace-write / danger-full-access

⚠️ best-effort: tool/path permissions (read-only denies write/shell) — not an OS sandbox

⚠️ agent-enforced: mode/force (read-only = --mode ask, write/shell tools unavailable) — not an OS sandbox

How the answer is read

--output-format json on agy 1.1.8+ (stream-json when watching); else stdout, else scraped from transcript.jsonl

Written to a file via -o/--output-last-message

stdout (-s silent mode)

stdout (--output-format text)

Continue mechanism

Pins the workspace's conversation id (--conversation)

Resumes the session id (codex exec resume <id>)

Resumes a self-set session UUID (--session-id)

Mints a chat id (create-chat) and resumes it (--resume <id>)

Auth

OS credential store (AI Pro session)

codex login (ChatGPT account or API key)

OS credential store (copilot login) or a GitHub token env

cursor-agent login (OS credential store) or CURSOR_API_KEY

In a swarm

Runs with an isolated HOME to avoid state races

Fresh one-shot — needs no isolation

Fresh one-shot — needs no isolation

Fresh one-shot — needs no isolation

🧪 The two experimental backends — and how you can help

Grok Build and Kimi Code are wired in exactly like the other four, with one honest difference: no authenticated round-trip has ever run against either. I don't have a SuperGrok / X Premium+ subscription or a Kimi plan, so I cannot prove they answer. They ship anyway because a bridge nobody can install is a bridge nobody can verify — and because the parts that usually rot are already pinned down.

What is verified live (each CLI installed, run, and observed — just never logged in):

🧪 Grok Build (grok -p)

🌙 Kimi Code (kimi -p)

Verified against

grok 1.0.3 / Windows

kimi 0.29.1 / Windows

Flag surface

✅ read off the open-source clap definitions (xai-org/grok-build), then confirmed against live grok --help. Every argv the bridge can build was executed and parses cleanly

✅ confirmed against live kimi --help; also that -p rejects --auto/--yolo (print mode already self-approves, so the bridge passes neither)

Auth failure mode

✅ exit 1 + {"type":"error","message":"Not signed in. …"} on stdout; no browser, no hang

✅ exit 1 + stderr No model configured

Model list

grok models answers while logged out — so auth checks and model validation cost nothing. Live default is grok-4.5, not the grok-build xAI's own docs still print

⚠️ none — Kimi has no models command; aliases are user-defined in config.toml, so model is a lenient pass-through

On-disk layout

~/.grok/ (config.toml, auth.json, sessions/, logs/); GROK_HOME really relocates it

~/.kimi-code/ (config.toml, device_id, logs/)

Concurrency

✅ parallel grok -p runs don't deadlock on ~/.grok's lock files

❔ untested

What is NOT verified — everything behind the auth wall:

  • the happy-path answer itself: Grok's json envelope (text / sessionId) and Kimi's stdout answer;

  • that -r / -c really restore context;

  • Grok's streaming-json event stream, which watch mode renders;

  • whether Grok's sandbox profiles behave as documented (and note: auth is checked before --sandbox and -m are validated, so a bad value can't even be observed while logged out — which is why the bridge validates both client-side).

NOTE

Deliberately scoped out for Kimi: agent_swarm and watch support. Both would depend on Kimi's stream-json envelope, and adding an unverified dependency on top of an unverified backend is how you get two bugs that mask each other. Grok gets both, because its stream format is documented in detail and its error events were observed live.

How to help

If you have either subscription, please open a verification issue. The template is a checklist — tick only what you actually saw. The first box ("a fresh ask returned a real answer") is worth more than all the others combined, and takes about a minute:

# 1. Does the setup look right? (spends no quota)
#    -> call grok_status / kimi_status from Claude Code
# 2. Does it answer?
#    -> call grok_ask("say hi") / kimi_ask("say hi")
# 3. If it fails, does the raw CLI fail the same way?
grok -p "say hi" --output-format json
kimi -p "say hi" --output-format text

That last command is the one I can't run from here, and it's what separates "the bridge is wrong" from "the CLI changed". Partial reports are welcome; so is a plain "it didn't work, here's the error".

How it works

All six backends run headless and one-shot per call; the bridge's job is to get a clean answer out of each and hand it to Claude Code as a plain string.

flowchart LR
    A([Claude Code]) -- "MCP tool call" --> B["bridge<br/>(server.py)"]
    B -- "antigravity_*" --> C[agy -p]
    B -- "codex_*" --> D[codex exec]
    B -- "copilot_*" --> E[copilot -p]
    B -- "cursor_*" --> F[cursor-agent -p]
    C -- "json / stream-json (1.1.8+)<br/>else stdout or transcript.jsonl / .db" --> B
    D -- "output-last-message file" --> B
    E -- "stdout (-s silent)" --> B
    F -- "stdout (--output-format text)" --> B
    B -- "plain text" --> A

Antigravity. On agy 1.1.8+ the bridge asks for structured output and reads a contractual field instead of guessing: plain calls use --output-format json and return its response, while watch mode uses --output-format stream-json and rebuilds the answer from the stream's terminal result event (the same shape the Cursor bridge already used). Both also carry a conversation_id, which the bridge records so antigravity_continue pins exactly the thread it last ran in that workspace.

Older agy has no such flag, so the original path stays: on 1.0.15+ (Windows) agy -p writes its clean answer to stdout and the bridge returns that; on older agy — or non-Windows, or a --sandbox run — stdout is empty and the bridge falls back to agy's own transcript at:

~/.gemini/antigravity-cli/brain/<conv-id>/.system_generated/logs/transcript.jsonl

For that fallback it locates the conversation via cache/last_conversations.json (falling back to the newest brain/ directory touched since launch), streams the transcript, and returns the final source=MODEL, status=DONE, type=PLANNER_RESPONSE entry — the answer, minus the intermediate tool-calling steps (or the SQLite .db agy dual-writes, when no JSONL exists). This fallback still runs on 1.1.8+ whenever a run yields no result, so nothing depends on the structured path alone.

Codex. codex exec is well-behaved: the bridge passes -o/--output-last-message <file> and codex writes its final message straight there — no scraping. Continue works by capturing the session id from codex's own rollout files (~/.codex/sessions/.../rollout-*.jsonl) and resuming with codex exec resume <id>, falling back to the newest on-disk session for that cwd after a server restart.

Copilot. copilot -p "<prompt>" -s runs a prompt non-interactively and prints the clean final answer to stdout — the bridge reads it there, no scraping. It runs headless with --allow-all-tools --no-ask-user --no-auto-update (so it never blocks on a prompt), and disables copilot's flaky builtin GitHub-API MCP by default for predictable latency (COPILOT_GITHUB_MCP=1 re-enables it). Continue is deterministic: copilot's --session-id <uuid> both sets a new session's id and resumes an existing one, so the bridge generates the UUID itself, pins it to the workspace, and resumes that exact session — falling back after a restart to the newest on-disk session (~/.copilot/session-state/<id>/workspace.yaml) whose recorded cwd matches.

Cursor. cursor-agent -p --output-format text --trust "<prompt>" runs a prompt non-interactively and writes the clean final answer straight to stdout — the bridge reads it there, no scraping (--trust trusts the workspace so it never blocks on a prompt). Continue is deterministic and race-free: cursor-agent create-chat mints a fresh chat and prints its id, so the bridge mints the id itself, pins it to the workspace, and resumes that exact chat with -p --resume <chatId> — no rollout-scraping. After a restart it falls back to the newest on-disk chat under ~/.cursor/chats/<md5(workspace)>/<chat-id>/ whose meta.json cwd matches (the chat-dir hash is itself md5 of the workspace path).

Set up in 60 seconds

Prerequisites — install whichever backend(s) you want, and sign in once each:

  • Antigravity: install agy and sign in to Antigravity once (via the IDE or agy -i).

  • Codex: install codex and run codex login once (ChatGPT account or API key).

  • Copilot: install copilot (npm i -g @github/copilot, or winget install GitHub.Copilot) and run copilot then /login once (or set a COPILOT_GITHUB_TOKEN/GH_TOKEN env var).

  • Cursor: install cursor-agent (curl https://cursor.com/install -fsSL | bash) and run cursor-agent login once (or set a CURSOR_API_KEY env var).

You don't need all six — the tools for a missing CLI simply report "not found" via their *_status tool.

With uv installed, register the bridge straight from PyPI under mcpServers in ~/.claude.json — no path to hardcode, no git pull to remember:

"agent-intern": {
  "command": "uvx",
  "args": ["agent-intern"]
}

uvx pins to the version it first caches and does not auto-upgrade, so you never run an update you didn't choose — important, since the bridge runs unsandboxed code: a surprise (or compromised) release can't execute until you opt in. You still get told when there's something to opt into: any *_status call reports whether a newer release is out, and Claude is instructed to pass that on when it sees it. (There's a startup check too, but it writes to stderr — that only reaches your MCP logs, not you.) Upgrade deliberately and restart Claude Code:

uvx agent-intern@latest      # fetch + run the newest release (refreshes uv's cache)
TIP

Prefer hands-off auto-updates? Put"args": ["agent-intern@latest"] in the config instead — every launch runs the newest release. Convenient, but it pulls new code without asking each time.

From source

Clone it instead if you want to hack on the bridge or pin a local copy:

git clone https://github.com/SinanTufekci/agent-intern.git
cd agent-intern
pip install fastmcp
python test_smoke.py        # 4 real round-trips (ask, continue, image, swarm) — prints four PASS lines
NOTE

The smoke test costs a tiny bit of quota and takes ~30–60 s. It exercises the Antigravity path.

Then point Claude Code at the absolute path to server.py under mcpServers in ~/.claude.json:

"agent-intern": {
  "command": "python",
  "args": ["C:\\path\\to\\server.py"]
}
"agent-intern": {
  "command": "python3",
  "args": ["/path/to/server.py"]
}

Restart Claude Code. Twenty-one tools appear, each prefixed mcp__agent-intern__:

  • Antigravity (5): antigravity_ask, antigravity_continue, antigravity_image, antigravity_image_swarm, antigravity_status

  • Codex (3): codex_ask, codex_continue, codex_status

  • Copilot (3): copilot_ask, copilot_continue, copilot_status

  • Cursor (3): cursor_ask, cursor_continue, cursor_status

  • Grok (3, experimental): grok_ask, grok_continue, grok_status

  • Kimi (3, experimental): kimi_ask, kimi_continue, kimi_status

  • Shared (1): agent_swarm — fans a list of tasks out across five backends in one run (everything but Kimi)

The single-prompt tools — Antigravity, Codex, Copilot, Cursor, and Grok — take a watch=true flag for the live browser view (Watch mode). Kimi has no watch mode yet.

NOTE

Your client learns how to use the bridge on its own. The server ships MCP instructions — a short routing guide (when to reach for each tool, which backend to pick, and to pass workspace so the sub-agent has repo context) that a client like Claude Code injects into the model's context on connect, as an "MCP Server Instructions" block. So the host model knows how and when to drive these tools without you explaining them — you can just ask for the result.

"Use antigravity_ask to summarize the README of this repo in three bullets." → Claude routes the prompt through the bridge, agy reads the file under the workspace root, and the answer comes back as a plain string. Swap in codex_ask, copilot_ask, or cursor_ask to have GPT, Copilot, or Cursor do the same.

Tools

🛰️ Antigravity

Tool

Purpose

antigravity_ask(prompt, workspace?, model?, timeout_s?=180, watch?=false, plan?=false, schema?)

Start a new Antigravity conversation. model selects the model (agy's --model, e.g. "claude-sonnet-4-6"); validated against agy models, defaults to your settings.json model. watch=true opens the live browser view (Watch mode). plan=true runs agy in plan mode — it reads and writes a plan, but does not edit files or run commands (Security; agy 1.1.12+). schema (a JSON Schema) returns the validated object as JSON text instead of prose — read the caveat in Status & caveats before using it for a judgment (agy 1.1.8+).

antigravity_continue(prompt, workspace?, model?, timeout_s?=180, watch?=false, plan?=false, schema?)

Continue the conversation rooted at workspace (pinned by id). agy's model is per-invocation, so model can differ from the original ask — and so are plan and schema, so a follow-up can be restricted, or shaped, even if the original ask was not. watch=true opens the live view.

antigravity_image(prompt, output_path?, workspace?, timeout_s?=240, watch?=false)

Generate an image; saves the file (extension corrected to the real bytes) and returns its path + format/size. watch=true streams progress and shows the image inline.

antigravity_image_swarm(prompts, output_paths?, workspaces?, max_concurrency?=4, timeout_s?=240, watch?=false)

Generate several images in parallel (one worker per prompt).

antigravity_status()

Setup diagnostics: the bridge's own version + whether a newer release is available, remaining AI Pro quota per model family (agy 1.1.11+), plus agy version/compat, state dirs, and newest-transcript readability. Spends no quota.

🤖 Codex

Tool

Purpose

codex_ask(prompt, workspace?, sandbox?="read-only", model?, timeout_s?=180, watch?=false)

Start a new Codex session. sandbox is a real boundary (see Codex bridge); model selects the model (-m). watch=true opens the live view, streaming codex's steps from its --json event stream.

codex_continue(prompt, workspace?, timeout_s?=180, watch?=false)

Continue the Codex session rooted at workspace — resumes the exact session id, falling back to the newest on-disk session for that cwd after a server restart. The resumed session keeps its original sandbox and model. watch=true opens the live view.

codex_status()

Setup diagnostics: codex version, login status (codex login status), sessions dir. Spends no quota.

🐙 Copilot

Tool

Purpose

copilot_ask(prompt, workspace?, sandbox?="read-only", model?, timeout_s?=180, watch?=false)

Start a new Copilot session. sandbox maps to copilot's tool/path permissions (best-effort, not an OS sandbox — see Copilot bridge); model selects the model (--model). watch=true opens the live view, streaming copilot's steps from its --output-format json event stream.

copilot_continue(prompt, workspace?, sandbox?="read-only", timeout_s?=180, watch?=false)

Continue the Copilot session rooted at workspace — resumes the exact self-set session id, falling back to the newest on-disk session for that cwd after a restart. Unlike Codex, sandbox applies here too (copilot re-applies permissions each turn). watch=true opens the live view.

copilot_status()

Setup diagnostics: copilot version, an auth hint (no login status command exists, so best-effort), session-state dir. Spends no quota.

✳️ Cursor

Tool

Purpose

cursor_ask(prompt, workspace?, sandbox?="read-only", model?, timeout_s?=180, watch?=false)

Start a new Cursor chat. sandbox maps to cursor's mode/force flags (agent-enforced, not an OS sandbox — see Cursor bridge); model selects the model (--model, validated against cursor-agent models). watch=true opens the live view, streaming cursor's steps from its --output-format stream-json event stream.

cursor_continue(prompt, workspace?, sandbox?="read-only", timeout_s?=180, watch?=false)

Continue the Cursor chat rooted at workspace — resumes the exact chat id the bridge minted (create-chat + --resume), falling back to the newest on-disk chat for that cwd after a restart. watch=true opens the live view.

cursor_status()

Setup diagnostics: the bridge's own version + whether a newer release is available, plus cursor version and login status (cursor-agent status). Spends no quota.

🧪 Grok Build (experimental — unverified)

Tool

Purpose

grok_ask(prompt, workspace?, sandbox?="read-only", model?, timeout_s?=180, watch?=false)

Start a new Grok session. sandbox maps to grok's --sandbox profile plus a tool allowlist — a real OS boundary on Linux/macOS only (see Grok bridge); model selects the model (-m, validated against grok models). watch=true opens the live view, streaming grok's steps from its --output-format streaming-json event stream.

grok_continue(prompt, workspace?, sandbox?="read-only", timeout_s?=180, watch?=false)

Continue the Grok session rooted at workspace — resumes the exact session id grok returned (-r), falling back to grok's own "most recent session for this cwd" (-c) after a restart. sandbox applies here too. watch=true opens the live view.

grok_status()

Setup diagnostics: the bridge's own version + whether a newer release is available, plus grok version, auth state, and the model list — the last two both from grok models, which answers even while logged out. Spends no quota.

🌙 Kimi Code (experimental — unverified)

Tool

Purpose

kimi_ask(prompt, workspace?, model?, timeout_s?=180)

Start a new Kimi session. No sandbox argument — Kimi print mode has no sandbox and auto-executes every tool. model is a lenient pass-through (-m, an alias from your config.toml); Kimi has no model list to validate against. No watch mode.

kimi_continue(prompt, workspace?, timeout_s?=180)

Continue the Kimi session rooted at workspace (-c). Kimi scopes sessions per working directory, so there's no id to track — and no restart problem either.

kimi_status()

Setup diagnostics: bridge version + update check, kimi version, whether a provider is configured (kimi provider list — the auth proxy), and the data dir. Spends no quota.

🐝 Shared

Tool

Purpose

agent_swarm(tasks, max_concurrency?=4, timeout_s?=180, watch?=false)

Run several tasks in parallel across five backends — each task names its backend (antigravity, codex, copilot, cursor, or grok) plus a prompt (an optional model and sandbox for any backend — on Antigravity sandbox: "read-only" means plan mode). Every answer comes back in one block; watch=true opens the live dashboard (Swarm). Kimi is not available here — see Experimental backends.

workspace defaults to the MCP server's current working directory. Point it at a real project dir for context-aware answers — every backend gives the model access to files under that root (Codex, Copilot, and Cursor honoring their sandbox).

sandbox now applies to Antigravity too. It used to be silently ignored there, so an agy task written as {"backend": "agy", "sandbox": "read-only"} ran completely unrestricted while reading as though it were fenced. "read-only" maps to agy's plan mode, "danger-full-access" says plainly that the worker is unrestricted, and "workspace-write" is refused — agy has no write scoping to offer, and accepting it would promise a fence that doesn't exist. Omitting sandbox leaves an Antigravity worker unrestricted, unlike every other backend, whose default is read-only: that long-standing default is left alone so existing file-writing swarms keep working, so fence agy explicitly when you want it fenced.

antigravity_image forces agy to save to an explicit absolute path — without one, agy falls back to its own scratch dir (~/.gemini/antigravity-cli/scratch/). It then corrects the file extension to match the real bytes: agy's image model picks the format itself (JPEG for photo-like images, PNG for flat graphics), so a requested out.png may come back as out.jpg. The returned path always reflects the true format.

🤖 Codex bridge — the well-behaved sibling

codex exec writes its final message to a file the bridge asks for via -o/--output-last-message, so the answer comes back without any scraping (where agy needed a transcript workaround before 1.0.15 fixed its stdout). Three things make Codex worth reaching for over Antigravity:

  • Real sandbox. sandbox accepts read-only (default — reads and answers, writes nothing), workspace-write (may edit files under the workspace), or danger-full-access (no sandbox — avoid). Unlike agy's no-op --sandbox, codex's -s actually enforces this. codex exec has no interactive approval gate, so this flag is your safety boundary — opt into write access deliberately.

  • Model selection works. model maps to codex's -m. (agy's --model works in print mode too as of 1.0.16; every backend now exposes the same model knob, except Kimi, which has no list to validate against.)

  • Stronger reasoning. Codex is a coding agent, not an image model — there's no codex_image. Its strength is reasoning and real code/repo work; hand it the jobs that need a heavier model.

Auth. Uses your existing Codex login (ChatGPT account or API key). Run codex login once; check with codex_status. No new keys for the bridge to manage.

WARNING

codex exec runs the model as an autonomous agent with no interactive approval gate. The sandbox flag (default read-only) is the real boundary, but workspace-write / danger-full-access let it modify files — and a swarm runs N agents at once. Only use it with trusted prompts on trusted content.

🐙 Copilot bridge — GitHub's agentic coder

The GitHub Copilot CLI (copilot, from @github/copilot) is stdout-native like Codex: copilot -p "<prompt>" -s runs a prompt non-interactively and prints just the final answer to stdout, so the bridge reads it there — no scraping. What makes it worth reaching for:

  • Model selection. model maps to copilot's --model; auto lets Copilot pick. Unlike the agy and cursor tools, the bridge can't validate this — copilot exposes no non-interactive model list — and the working set is account-dependent: on a Copilot Pro account here, auto worked while gpt-5.3-codex, claude-sonnet-4.6, and even GitHub's own --help example gpt-5.4 were all rejected as "not available". So omit model (account default) or pass auto unless you know your plan's ids; an unavailable one errors immediately with copilot's message, costing a call.

  • Deterministic, race-free continue. copilot's --session-id <uuid> both sets a new session's id and resumes an existing one, so the bridge generates the UUID itself and pins it to the workspace — no rollout-scraping. After a restart it falls back to the newest on-disk session (~/.copilot/session-state/<id>/workspace.yaml) whose recorded cwd matches.

  • Fast by default. Runs with --allow-all-tools --no-ask-user --no-auto-update, and disables copilot's builtin GitHub-API MCP (--disable-builtin-mcps) because its flaky HTTP connect can stall a call up to ~60 s. Set COPILOT_GITHUB_MCP=1 to keep it (for Copilot's issue/PR/repo tools).

Sandbox is best-effort, not enforced. Unlike Codex's OS sandbox, copilot's boundary is tool/path permissions. The sandbox knob maps to copilot flags for a uniform cross-backend field:

  • read-only (default) — auto-approves tools so it runs headless, then denies the local write and shell tools (--deny-tool). Best-effort: it is not an OS sandbox, and network/MCP tools can still act. For a hard read-only boundary, use codex_ask instead.

  • workspace-write — writes allowed, but file access stays confined to the workspace (no --allow-all-paths).

  • danger-full-access--allow-all (tools + all paths + all URLs). Avoid.

Auth. Uses your existing Copilot login — run copilot then /login once (stored in the OS credential store), or set COPILOT_GITHUB_TOKEN/GH_TOKEN/GITHUB_TOKEN for headless use. Check with copilot_status. If copilot isn't on PATH (the winget install can land off a stale PATH), set COPILOT_BIN to its full path — e.g. %LOCALAPPDATA%\Microsoft\WinGet\Packages\GitHub.Copilot_*\copilot.exe.

WARNING

copilot -p runs the model as an autonomous agent with --allow-all-tools (required to run headless). Its sandbox is best-effort tool/path permissions, not an OS sandbox — safer than agy, weaker than Codex's read-only. Only use it with trusted prompts on trusted content.

✳️ Cursor bridge — the widest model menu

Cursor's agent CLI (cursor-agent, from cursor.com/cli) is stdout-native like Codex and Copilot: cursor-agent -p --output-format text --trust "<prompt>" runs a prompt non-interactively and writes just the final answer to stdout, so the bridge reads it there — no scraping (--trust trusts the workspace so it won't block on a prompt). What makes it worth reaching for:

  • The widest model menu. model maps to cursor's --model (e.g. auto, gpt-5.2, claude-opus-4-8-high, composer-2.5, cursor-grok-4.5-high) — GPT, Claude, Grok, and Composer in one place, ~190 ids at the time of writing. cursor bakes the effort and speed axes into the id (…-low / -high / -xhigh / -max, each with a -fast twin), and also accepts a bracket form on the family base, e.g. claude-opus-4-8[context=1m,effort=high]. The bridge validates against cursor-agent models and rejects a typo up front (like agy), accepting either an exact id or a family base. Omit model to use your Cursor account default. cursor reshuffles this list often — run cursor-agent models (or cursor_status) rather than trusting an example here.

  • Deterministic, race-free continue. cursor-agent create-chat mints a fresh chat and prints its id, and -p --resume <chatId> resumes that exact chat — so the bridge mints the id itself, pins it to the workspace, and resumes deterministically (no rollout-scraping, same idea as Copilot's self-set session id). After a restart it falls back to the newest on-disk chat under ~/.cursor/chats/<md5(workspace)>/<chat-id>/ whose meta.json cwd matches (the chat-dir hash is itself md5 of the workspace path).

Sandbox is agent-enforced, not an OS sandbox. Like Copilot, cursor's boundary is which tools the agent can reach, not an OS jail. The sandbox knob maps to cursor's mode/force flags for a uniform cross-backend field:

  • read-only (default) — --mode ask: the write and shell tools are unavailable, so cursor analyzes and answers but makes no edits (verified: it refuses to write files). Agent-enforced and best-effort — it is not an OS sandbox. For a hard read-only boundary, use codex_ask instead.

  • workspace-write--force: edits and commands allowed, file access rooted at --workspace.

  • danger-full-access--force --sandbox disabled (OS sandbox off). Avoid.

(Cursor also exposes an OS-level --sandbox enabled/disabled; the bridge drives the uniform field via mode/force.)

Auth. Uses your existing Cursor login — run cursor-agent login once (OS credential store), or set CURSOR_API_KEY for headless use. Check with cursor_status. If cursor-agent isn't reliably on PATH (the installer drops a cursor-agent.CMD shim a bare name can't launch on Windows), set CURSOR_BIN to its full path — mirrors the AGY_BIN/CODEX_BIN/COPILOT_BIN overrides.

WARNING

cursor-agent -p runs the model as an autonomous agent with --trust (and --force when writes are allowed). Its sandbox is agent-enforced (read-only makes the write/shell tools unavailable), not an OS sandbox — safer than agy, weaker than Codex's read-only. Only use it with trusted prompts on trusted content.

🧪 Grok Build bridge — a real sandbox, on two of three platforms

WARNING

EXPERIMENTAL — never verified end-to-end. Everything below the "Auth" line is confirmed against a live grok 1.0.3; the answer path is not. See Experimental backends, and please report what you find.

xAI's Grok Build (grok, installed with curl -fsSL https://x.ai/cli/install.sh | bash, or irm https://x.ai/cli/install.ps1 | iex on Windows) is stdout-native like Codex/Copilot/Cursor: grok -p "<prompt>" --output-format json runs a prompt non-interactively and writes a single JSON result object to stdout. What makes it interesting:

  • It's open source. xai-org/grok-build publishes the actual CLI source, so this bridge's flag surface was read off the real clap definitions rather than inferred from docs — then confirmed against grok --help. That's a much stronger footing than a docs-derived bridge, and it caught a live discrepancy: xAI's own headless docs use -m grok-build in their examples, but the real default on 1.0.3 is grok-4.5.

  • The answer carries its own session id. --output-format json returns {"text": …, "sessionId": …, "usage": …}, so the bridge pins that id and resumes the exact session with -r <id> — no id-minting dance like Cursor's, no rollout-scraping like Codex's. After a restart it falls back to -c, grok's own "most recent session for this cwd", so continue survives without ever reading grok's opaque SQLite session store.

  • Free auth + model checks. grok models answers while logged out (exit 0, printing You are not authenticated. and the catalogue), so grok_status and model validation cost nothing and need no login.

Sandbox is real — on Linux and macOS. This is the only backend besides Codex with an OS-enforced boundary, but read the platform caveat:

  • read-only (default) — --sandbox read-only plus a --tools allowlist (read_file,list_dir,grep,glob,web_search,web_fetch) plus --no-subagents.

  • workspace-write--sandbox workspace: writes land in the workspace, ~/.grok, and temp.

  • danger-full-access--sandbox off. Avoid.

CAUTION

On Windows, grok's OS sandbox does not apply. It's implemented with Landlock (Linux) and Seatbelt (macOS); where it can't be applied, xAI's docs say grok "logs a warning and continues without enforcement." That's why read-only here doesn't lean on the profile alone — the tool allowlist is agent-enforced and holds on every platform. An allowlist, not a denylist, precisely because it fails safe: a future grok that adds a new write tool can't silently slip through it. Note that MCP meta-tools stay available under an allowlist, so a configured MCP server could still write. For a hard boundary on every platform, use codex_ask.

Every mode also passes --always-approve: grok's headless mode does not auto-approve on its own (unlike agy and Kimi), and there's no human to answer a prompt. Containment comes from the profile and the allowlist, not from the approval gate.

Auth. grok login (browser OAuth), grok login --device-code (headless), or an XAI_API_KEY env var; credentials cache in ~/.grok/auth.json. Needs a SuperGrok or X Premium+ subscription. Check with grok_status. Set GROK_BIN to override the executable path — though the bridge already falls back to the installer's own ~/.grok/bin when grok isn't on PATH, which matters because the installer appends to the user PATH and that never reaches an already-running server process. GROK_HOME relocates the whole data dir. The bridge disables grok's background auto-updater per call via GROK_DISABLE_AUTOUPDATER=1 — a CLI that updates itself mid-session has broken this project before.

🌙 Kimi Code bridge — no sandbox, per-directory sessions

WARNING

EXPERIMENTAL — never verified end-to-end. See Experimental backends.

Moonshot's Kimi Code (kimi, npm @moonshot-ai/kimi-code) runs the Kimi K2 family. kimi -p "<prompt>" --output-format text writes the clean final answer to stdout.

  • Continue is per-directory. Kimi scopes sessions to the working directory and exposes -c/--continue, so the bridge just re-runs with cwd=workspace and -c — no id to capture, and no restart problem. (-S/--session <id> exists but is deliberately unused: its on-disk format couldn't be verified.)

  • No model validation. Kimi has no models command; aliases are user-defined in ~/.kimi-code/config.toml under [models."<alias>"]. model is a lenient pass-through, so a bad alias surfaces as Kimi's own run-time error.

  • -p refuses --auto and --yolo (verified live on 0.29.1: "Cannot combine --prompt with …") because print mode is already self-approving — so the bridge passes neither.

CAUTION

Kimi has no sandbox and no sandbox argument. Print mode auto-executes every tool call with no approval gate — the same posture as agy's print mode. No flag makes it safe. Only use it with trusted prompts on trusted content.

Auth. kimi login (device-code OAuth) or an API key in ~/.kimi-code/config.toml (it does not read a bare env var). Check with kimi_status, which reads kimi provider list as the auth proxy. Set KIMI_BIN to override the executable path; KIMI_CODE_HOME relocates the data dir.

No swarm or watch support, deliberately — both would depend on Kimi's stream-json envelope, which no one has confirmed. They'll follow a successful verification report.

👁️ Watch mode — Agent Intern (experimental)

Pass watch=true to any single-prompt toolantigravity_ask, antigravity_continue, antigravity_image, codex_ask, codex_continue, copilot_ask, copilot_continue, cursor_ask, cursor_continue, grok_ask, or grok_continue — to watch the agent work live in a little chat-style browser window called Agent Intern. The agent still runs headless; alongside it the bridge serves a tiny page on 127.0.0.1 and opens it in a small, chromeless app window that renders the exchange as a conversation: your prompt shows as a chat bubble, the agent's live steps stream in a collapsible "thinking" trace — its planner narration (▸), the real commands it runs ($), and completions (✓), read live (from agy's --output-format stream-json on 1.1.8+ — its transcript on older agy — or codex's / copilot's JSON event stream, or cursor's / grok's streaming-json) — and the final answer arrives as a Markdown card (and, for antigravity_image with watch=true, the generated image shown inline). A *_continue run opens with the prior turns of the conversation shown as history, so it reads as one ongoing thread rather than a blank new window. (A watched cursor_continue is the exception — Cursor stores its transcript in an opaque SQLite blob, so its window opens without visible prior-turn history.)

  • Cross-platform & best-effort. Prefers a Chromium browser (--app mode) for the windowed look; falls back to a normal browser window. If nothing can open, the run still completes and returns normally.

  • Window size. Set AGY_WATCH_WINDOW_SIZE (e.g. AGY_WATCH_WINDOW_SIZE=480,700) to resize the window; default is 560,760. Press Enter / Esc in the window to close it.

  • One window, reused — but concurrent runs stay separate. Repeated sequential watch calls reuse the already-open window instead of stacking a new one (the open page resets itself for the new run; the swarm dashboard rebuilds for the new fan-out). A run that starts while another watched run is still working gets its own window instead — so two concurrent single-worker runs (e.g. a codex_ask and a copilot_ask at once) each stream into their own view and never clobber each other. If you closed the window, the next run opens a fresh one. Set AGY_WATCH_ALWAYS_NEW=1 to force a new window every time.

  • Access control. The viewer is an HTTP server, and it serves your prompts, the answers, and the real commands the agents ran — so it binds 127.0.0.1 on an ephemeral port and requires two things on every request: a loopback Host header (which is what makes DNS rebinding fail — a rebound page arrives under the attacker's hostname) and a per-process token carried in the URL, which stops another local process or another user on a shared machine from simply connecting. The bridge puts the token in every URL it opens, so none of this is visible in normal use. Worth knowing because the server starts lazily but is never stopped: one watch=true run leaves the port listening for the life of the MCP server.

  • Chat layout & history. Prompts render as chat bubbles (labelled CLAUDE, since the MCP client writes them) — long ones clamp to a few lines with a show more / show less toggle — and answers as Markdown cards tagged with the backend (AGY / CODEX / COPILOT / CURSOR). A *_continue run seeds the window with the conversation's prior turns, read from each backend's own session store (agy's transcript, codex's rollout, copilot's events.jsonl; Cursor's store is opaque, so a watched cursor_continue opens without visible history). The swarm's per-worker detail window uses the same chat design for its one task.

  • Progress, keyboard & copy. Each panel shows a time progress bar (elapsed / timeout). The swarm dashboard adds an overall done/total bar and per-row time bars; use ↑/↓ to select a worker and to open its detail window. Answers render as Markdown with a copy button, and a "jump to latest" badge appears if you scroll up.

  • Coarse, not token-level. The backends flush their step stream in chunks, so you get a handful of live steps, not character streaming. The returned value is identical to the non-watch call. Nothing is sent anywhere but your own machine.

🐝 Swarm — run agents in parallel

agent_swarm fans a list of tasks out to workers that run truly concurrently (capped at max_concurrency, default 4), then returns every worker's result in one block. Each task names its own backend, so a single swarm can mix Antigravity (Gemini), Codex, Copilot, and Cursor workers — hand the reasoning-heavy jobs to Codex, Copilot, or Cursor and the quick ones to Gemini, all at once. Good for independent sub-tasks: summarise N files, ask the same question about N repos, fix N bugs. (antigravity_image_swarm stays separate — it generates N images, and only agy has an image model.)

agent_swarm(tasks=[
  {"backend": "antigravity", "prompt": "Summarise src/auth.py in 2 bullets."},
  {"backend": "codex", "prompt": "Find and fix the failing test in tests/",
   "sandbox": "workspace-write", "workspace": "./repo"},
  {"backend": "copilot", "prompt": "Explain what src/api.py exposes.",
   "sandbox": "read-only", "workspace": "./repo"},
  {"backend": "cursor", "prompt": "Draft a docstring for src/utils.py.",
   "model": "auto", "workspace": "./repo"},
  {"backend": "grok", "prompt": "List the public exports of src/index.ts.",
   "sandbox": "read-only", "model": "grok-4.5", "workspace": "./repo"},
])

How it stays correct under concurrency. The single-agent agy tools serialize through a lock because agy rewrites last_conversations.json on every call, so concurrent runs sharing one state dir would race. The swarm sidesteps this: each agy worker runs with its own isolated HOME/USERPROFILE, so agy's brain/, cache/, and last_conversations.json never collide — no lock needed. Auth still works because agy reads it from the OS credential store, not from ~/.gemini (verified on agy 1.0.9). Codex, Copilot, and Cursor workers need no such isolation — each is a fresh one-shot (codex exec with its own -o file; copilot -p with its own self-set session id; cursor-agent -p with its own minted chat id). Each worker's cwd is its real workspace, so file access is unchanged. Measured ~2.8× speedup at 3 agy workers (the AI Pro backend does not serialize per-account); higher max_concurrency trades quota/rate-limit pressure for wall-clock.

  • Per-task fieldsbackend (antigravity/codex/copilot/cursor/grok) and prompt are required; workspace defaults to the server cwd; sandbox and model apply to Codex, Copilot, and Cursor (ignored for Antigravity). Swarm workers are one-shot — there is no *_continue for a swarm worker's session.

  • Error isolation — a worker that fails is reported in place; the others still return.

  • watch=true — opens a thin live Agent Swarm dashboard (one row per worker, with a backend badge, repo, prompt, and latest step). Click a row to pop that agent into its own window streaming its full step log.

WARNING

A swarm launchesN unsandboxed agents at once — N× the prompt-injection "lethal trifecta" surface of a single call (see Security). Only use it with trusted prompts on trusted content. Codex workers honor their enforced sandbox; Copilot and Cursor workers honor their best-effort sandbox; Antigravity workers have no real boundary.

Model & auth

🛰️ Antigravity

🤖 Codex

🐙 Copilot

✳️ Cursor

Model

Selectable via the model argument (agy's --model, e.g. "gemini-3.1-pro-high", "claude-sonnet-4-6"); omit to use the "model" field in agy's settings.json (gemini-3.8-flash-high by default as of 1.1.25). agy 1.1.5 replaced the old human labels with these slugs — the old "Gemini 3.1 Pro (High)" form no longer works. Switching model in -p used to hang (through ~1.0.14) but is fixed as of 1.0.16. An unknown model was silently ignored through 1.1.1 and hard-fails in -p as of 1.1.2; either way the bridge validates it against agy models and rejects a typo up front. Flash High is speed-optimized for cheap tool-calling; pick a bigger model for heavier work.

Selectable via the model argument (codex's -m). codex does not hang on a switch, so model choice is a first-class knob.

Selectable via the model argument (--model, e.g. gpt-5.3-codex, claude-sonnet-4.6, auto); omit for your account default. An unavailable model errors immediately.

Selectable via the model argument (--model, e.g. gpt-5.2, claude-4-sonnet-thinking, auto, or parameterized ids like claude-opus-4-8[context=1m]); a wide GPT/Claude/Grok/Composer menu, validated against cursor-agent models (a typo is rejected up front). Omit for your Cursor account default.

Auth

Piggybacks whatever credential store agy uses on your OS (Windows Credential Manager, macOS Keychain, libsecret on Linux — the bridge never touches it directly). Log in once; every call silent-auths on the same AI Pro quota you already pay for.

Uses your existing Codex login — ChatGPT account or API key. Run codex login once; verify with codex_status.

Uses your existing Copilot login — run copilot then /login once (OS credential store), or set COPILOT_GITHUB_TOKEN/GH_TOKEN/GITHUB_TOKEN. Verify with copilot_status.

Uses your existing Cursor login — run cursor-agent login once (OS credential store), or set CURSOR_API_KEY. Verify with cursor_status.

⚠️ Security

All six backends run the model as an autonomous agent. The difference is whether you get a real boundary: Codex enforces one everywhere and Grok on Linux/macOS only; Copilot and Cursor offer best-effort ones; Antigravity and Kimi offer none.

Antigravity — no usable boundary

agy -p executes its own tools — reading and writing files, running shell commands, reaching the network — with no approval gate. Through agy 1.1.2 that was simply how print mode worked, with no opt-out at all. As of 1.1.3 it is a choice the bridge makes: agy finally gates headless tool calls, and the bridge deliberately opts out with --dangerously-skip-permissions, because a gated -p can do no useful work (it soft-denies even a plain file read, and print mode has no way to prompt). The posture below is therefore unchanged — assume every call runs arbitrary code with your privileges. The one exception is the opt-in plan=True described in the last bullet; it is a real restriction, but an agent-enforced one, so it does not change the default posture. Re-verified empirically on agy 1.0.9 / Windows, with the 1.1.3 amendment noted:

  • Print mode runs out-of-workspace file writes and live network fetches even without --dangerously-skip-permissions — that flag was a no-op for -p through 1.1.2. As of 1.1.3 it is load-bearing: without it every tool-using call is soft-denied, and the bridge now always passes it (it must precede -p, whose value is the prompt). There is still no agy flag that makes print mode both safe and useful.

  • agy 1.0.5 integrated a permission system (its logs show toolPermission=request-review), but it still does not gate print-mode execution — a fresh -p run created a file outside the workspace with no prompt. agy 1.0.12 reshuffled how that permission config merges (per-project files under ~/.gemini/config/projects/ now take precedence over ~/.gemini/antigravity-cli/settings.json), and 1.0.13 made "Always Approve" rule matching strict (non-regex) by default with a regex: opt-in and relaxed its redirection checks — but those are config/interactive-approval changes, they add no print-mode approval gate, and the bridge reads none of it.

  • --sandbox is not a usable boundary. agy 1.0.6 fixed its propagation into -p (the 1.0.6/1.0.7 changelog calls this "sandbox isolation correctly enforced") and it now does block terminal/ shell command execution — but re-verified on 1.0.9 that it leaves the write_to_file tool and network wide open: under --sandbox the model still wrote a file outside its workspace. agy 1.0.9 hardened the sandbox's command path (stricter exact-match command checks; .git added to its dangerous-paths list), but none of that closes the out-of-workspace write_to_file hole. On top of that, a --sandbox run whose blocked terminal command halts it writes no JSONL transcript (only the SQLite .db, re-confirmed on 1.0.9). The bridge can now read that .db, but still never passes --sandbox — it's no boundary, with file writes and network left open.

  • plan=True is the first Antigravity restriction that actually holds — opt-in, per call, on antigravity_ask / antigravity_continue, and gated at agy 1.1.12 (older agy parses --mode and ignores it in print mode, so the bridge refuses rather than handing back an unrestricted run that reports success). It maps to agy's --mode plan: agy investigates and writes an implementation plan into its own directory instead of touching yours. Verified on 1.1.20 through the bridge's own code path, with a control: the identical prompt — cmd /c echo SHELLRAN > <absolute path>executed and created the file on a normal call, and on plan=True created nothing at all, answering with a plan document. File reads still work, so it is genuinely useful rather than merely inert. Note what it is not: it constrains agy's agent loop, so it is agent-enforced like Copilot's and Cursor's modes, not an OS boundary — for that, use Codex (with the Windows caveat in Security firmly in mind). Two consequences worth knowing: it survives --dangerously-skip-permissions (which the bridge still passes, because dropping it would soft-deny the reads plan mode exists to allow), and it is mutually exclusive with the slash-command shield — agy silently disables plan mode when --disable-slash-commands is present, so the bridge drops that flag and rejects a prompt whose first token is a slash command instead.

Codex — a real sandbox you should use

codex exec also has no interactive approval gate, but its sandbox flag is a genuine boundary that codex enforces:

  • read-only (default) — reads and answers; writes nothing. Safe for untrusted questions on trusted content.

  • workspace-write — may edit files under the workspace. Opt in deliberately, per task.

  • danger-full-access — no sandbox at all. Avoid.

Because there's no approval prompt, the flag you pass is the safety decision — choose it per call.

⚠️ On Windows, as of codex 0.149.1, that boundary is currently too tight to be useful — and it fails silently. Every command is refused under both read-only and workspace-write (down to pwd) with rejected: blocked by policy: codex's policy engine can't classify the pwsh -Command <...> wrapper codex itself builds. Shell commands are how codex reads files, so a sandboxed run sees nothing of your workspace — and says nothing about it. Asked for the version in a local pyproject.toml declaring 0.27.0, it web-searched and answered 1.2.0 from an unrelated GitHub repo; with the sandbox off, 0.27.0. Exit 0 both times. Known upstream (#40060, #38886). The bridge can't fix it, but it no longer launders it: any answer whose run had commands refused comes back with a visible [agent-intern] WARNING naming the count. Until it's fixed upstream, treat a sandboxed codex answer on Windows as unsourced unless that warning is absent.

Copilot — best-effort, not an OS sandbox

copilot -p runs headless with --allow-all-tools (required — otherwise it blocks on per-tool permission prompts). Its sandbox maps to copilot's tool/path permission flags, which are a real-ish but not enforced boundary:

  • read-only (default) — auto-approves tools to run headless, then denies the local write and shell tools (--deny-tool). Blocks local file edits and command execution, but it is not an OS sandbox: other tools (including network/MCP) can still act. Weaker than Codex's read-only.

  • workspace-write — writes allowed, but file access stays confined to the workspace (no --allow-all-paths).

  • danger-full-access--allow-all (tools + all paths + all URLs). Avoid.

For a hard read-only boundary, prefer codex_ask.

Cursor — best-effort, agent-enforced

cursor-agent -p runs headless with --trust (and --force when writes are allowed). Its sandbox maps to cursor's mode/force flags — an agent-enforced, not OS-level, boundary:

  • read-only (default) — --mode ask: the local write and shell tools are unavailable, so cursor analyzes and answers but makes no edits (verified: it refuses to write files). Like Copilot, this is agent-enforced and not an OS sandbox. Weaker than Codex's read-only.

  • workspace-write--force: edits and commands allowed, file access rooted at --workspace.

  • danger-full-access--force --sandbox disabled (OS sandbox off). Avoid.

For a hard read-only boundary, prefer codex_ask.

Grok — real, but only on Linux and macOS

grok -p runs headless with --always-approve (its headless mode does not auto-approve on its own, and nothing is there to answer a prompt). Its sandbox maps to grok's OS profile plus a tool allowlist:

  • read-only (default) — --sandbox read-only + --tools read_file,list_dir,grep,glob,web_search,web_fetch

    • --no-subagents.

  • workspace-write--sandbox workspace: writes confined to the workspace, ~/.grok, temp.

  • danger-full-access--sandbox off. Avoid.

The profile is enforced by Landlock (Linux ≥ 5.13) and Seatbelt (macOS). On Windows there is no mechanism, and per xAI's docs grok "logs a warning and continues without enforcement" — so on Windows the only thing standing between read-only and your disk is the agent-enforced tool allowlist. Treat Windows read-only as best-effort (Copilot/Cursor tier), not as a jail. The bridge uses an allowlist rather than a denylist so that a future grok with a new write tool fails safe; note that MCP meta-tools remain available under an allowlist regardless.

⚠️ This backend is unverified — including these sandbox claims, which could not be exercised, because grok checks auth before it validates --sandbox.

Kimi — no boundary at all

kimi -p has no sandbox and no sandbox argument. Print mode auto-executes every tool call with no approval gate — the same posture as Antigravity, and verified live on 0.29.1 in the sense that -p rejects --auto/--yolo precisely because it is already self-approving. No flag makes it safe. Assume every kimi_ask runs arbitrary code with your privileges.

What that means for you

  • The workspace argument is only a starting context, not a security boundary — Antigravity and Kimi can and do act outside it; Codex is bounded by its enforced sandbox; Grok by its OS profile on Linux/macOS and by a tool allowlist elsewhere; Copilot by its best-effort tool/path permissions; Cursor by its agent-enforced mode/force.

  • An Antigravity or Kimi call effectively runs arbitrary code with your user privileges. A Copilot or Cursor call does too outside its best-effort denials; a Grok call does on Windows outside its allowlist; a Codex call does unless you keep it at read-only.

  • Only invoke these with trusted prompts on trusted content. Untrusted input here is the classic prompt-injection lethal trifecta: private-data access + code execution + network egress.

  • For real isolation, run the whole bridge inside a container or VM.

The bridge itself does only cross-platform filesystem reads under ~/.gemini/antigravity-cli/, ~/.codex/, ~/.copilot/, and ~/.cursor/ — no private APIs, no token theft. The risk above is entirely in what the sub-agents are allowed to do.

FAQ

It runs the official agy, codex, copilot, and cursor-agent CLIs under your own logins — no private APIs, no token theft, no quota abuse. It just bridges what the CLIs already do. That said, your AI Pro / Antigravity, OpenAI / Codex, GitHub Copilot, and Cursor ToS apply, and you're responsible for staying within them.

No. Each backend is independent — install only the CLI(s) you want. The tools for a missing backend report "not found" via their *_status tool (antigravity_status / codex_status / copilot_status / cursor_status / grok_status / kimi_status) and never crash the server.

It does now, by default. The server ships an instructions block that Claude Code loads with the tool list, and as of 0.29.0 that block tells it to offer delegation in one line before starting a task that fits — bulk mechanical work, a job that splits into independent parallel subtasks, or a second opinion on a risky diff — and to ask rather than just spend your quota. It's also told to ask once per task, not once per turn, and to drop it if you decline, because a suggestion on every task is nagging rather than help.

MCP instructions are guidance, though, not a rule the harness enforces — so if you want it reliably proactive, put it where Claude Code treats it as an instruction. Add this to your project or global CLAUDE.md:

## Delegating to sub-agents

The `intern` MCP server bridges Antigravity/Gemini, Codex, Copilot and Cursor as sub-agents
running on my own subscriptions. Before starting bulk mechanical work (a rename across many
files, boilerplate, a first-pass port), or anything that splits into independent parallel
subtasks, propose delegating it in one line and wait for my answer — e.g. "this is 6
independent files, shall I farm it out to Gemini in parallel?". Pass `workspace` = the repo
root. Don't propose it for small tasks or work that needs our conversation's context.

Turn it the other way — "never delegate without me asking first" — and that works too: the same file, the opposite sentence.

Use Antigravity for fast, cheap tool-calling, quick answers, and image generation (it's the only backend with an image model) — and it now lets you pick the model too (agy's --model). Use Codex for heavier reasoning, real code/repo work, or when you want a real, enforced workspace-write sandbox. Use Copilot for agentic coding on your GitHub Copilot plan, or as a second coding opinion alongside Codex — noting its sandbox is best-effort, not enforced. Use Cursor for agentic coding on a Cursor plan, or when you want the widest model menu — GPT, Claude, Grok, and Composer, all via model — noting its sandbox is agent-enforced, like Copilot's.

Grok and Kimi are experimental and unverified — reach for them to help verify them, or if they're the subscription you actually have. Grok is the more capable of the two here: real OS sandbox (Linux/macOS), watch mode, and swarm support. Kimi has no sandbox and no swarm/watch yet.

All of them let you choose a model (except Kimi, which can't validate one); in a swarm you can mix five of the six. See The backends at a glance.

Less likely now. As of agy 1.0.15 the bridge prefers agy's stdout on the happy path (1.0.15 fixed the print-mode stdout bug on Windows — -p now writes the clean answer there), which removes its dependence on agy's undocumented transcript schema for normal runs. It still falls back to reading the JSONL transcript, or the SQLite .db agy dual-writes, when stdout is empty (older agy, non-Windows, or --sandbox runs) — so a schema change would only bite that fallback path. Re-verified working on 1.0.15 (stdout answer clean under tool use; transcript/.db fallback intact; live ask round-trip + antigravity_status diagnostics pass). Still, if you rely on the fallback, pin a known-good agy version.

Yes. Pass model to antigravity_ask/antigravity_continue (or per task in agent_swarm) — it maps to agy's --model, taking any slug from agy models (e.g. "gemini-3.1-pro-high", "claude-sonnet-4-6"). Omit it to use the "model" field in agy's settings.json, which defaults to gemini-3.8-flash-high — speed-optimized for cheap tool-calling.

agy 1.1.5 renamed every model, replacing the old human labels ("Gemini 3.1 Pro (High)") with stable slugs (gemini-3.1-pro-high) — the old form is no longer accepted, so pass slugs. The default has since moved three times: 1.1.6 added the gemini-3.6-flash family and took it, the gemini-3.7-flash family arrived by 1.1.16 and took it in turn, and 1.1.25 added gemini-3.8-flash and moved the default onto that (verified through the bridge: a call passing no model answers as Gemini 3.8 Flash). The same release also dropped the whole gemini-3.5-flash family, which no changelog entry mentions — a 3.5 slug from older docs is now rejected up front. The full list, re-checked live on 1.1.25: gemini-3.8-flash-low|medium|high, gemini-3.7-flash-low|medium|high, gemini-3.6-flash-low|medium|high, gemini-3.1-pro-low|high, claude-sonnet-4-6, claude-opus-4-6-thinking, gpt-oss-120b-medium. Note the slug bakes in the reasoning effort, which is why the flash and pro models appear once per level. agy self-updates in the background, so treat any list written down here — this one included — as a snapshot; agy models and antigravity_status are the live answer.

agy 1.0.5 added --model, but through ~1.0.14 switching to a different model in -p hung the call, so earlier bridge versions stayed single-model. Re-verified on agy 1.0.16 that the hang is fixed — a Claude model answers as Anthropic Claude, a Gemini model as Gemini, each in seconds. One caveat the bridge handles for you: agy silently ignores an unknown model (it falls back to the default with no error), so the bridge validates your slug against agy models and rejects a typo up front. (That validation is also what agy 1.1.11 broke, by making agy models print <slug>\t<human label> instead of a bare slug — see Status & caveats. Fixed as of bridge 0.24.0; on 0.23.x with agy 1.1.11+, pass no model at all.)

Yes — that's the antigravity_image tool, on the Antigravity backend. agy's print mode generates real images on your AI Pro quota; antigravity_image drives it, saves the file to a path you choose (or a timestamped default in your workspace), fixes the extension to match the real bytes (agy picks JPEG or PNG itself), and returns the path. Verified on agy 1.0.9 / Windows. Codex has no image model — it's a coding agent.

No. It uses the same quota you already pay for — AI Pro for Antigravity, your Codex plan for Codex, your GitHub Copilot plan for Copilot, your Cursor plan for Cursor. The smoke test spends a negligible amount.

The final answer is request/response — the CLIs return it all at once, so the tools return when the agent finishes (each call typically takes 10–30 s; Copilot's reasoning models can run longer). If you want to watch the agent work as it goes, pass watch=true to any single-prompt tool: it opens the Agent Intern browser window and live-streams the agent's steps — see Watch mode. It's coarse (a handful of steps, not token-by-token), and the returned value is identical to the non-watch call.

The single-agent tools are serialized inside the server: agy rewrites last_conversations.json on every call, so concurrent runs sharing one state dir would race and could return the wrong conversation. A threading.Lock makes extra requests queue rather than race. (On agy 1.1.8+ the bridge also records the conversation_id agy reports for each run and prefers it when pinning a continue, so that resolution no longer depends on the shared file — but the lock stays, since agy's state dir is still shared and a fresh server process starts with nothing recorded.)

For real parallelism use agent_swarm — each agy worker runs in its own isolated state dir (and Codex/Copilot/Cursor workers need none), so they don't race and the lock isn't needed (~2.8× at 3 workers). That's the supported way to run many calls at once, across any backend.

The isolated state dir is a redirected HOME, and on macOS that also hides agy's stored credentials (the login keychain is resolved through $HOME), so isolated workers there fall back to running serialized in your real HOME — correct, but without the speedup. Windows is unaffected (Credential Manager is HOME-independent). See the swarm auth note.

Status & caveats

  • 🧪 Grok Build and Kimi Code ship UNVERIFIED — help wanted. Two new backends, neither ever exercised against an authenticated account, because I have neither subscription. This is a deliberate trade: shipping them unverified is the only way anyone can verify them, and the parts that historically rot — flag surfaces, model ids, error shapes — are pinned down live against grok 1.0.3 and kimi 0.29.1. Grok's are unusually solid, since its CLI is open source: every argv the bridge builds was read off the real clap definitions and confirmed to parse. What's unproven is everything behind each CLI's auth wall — the answer itself, resume, and Grok's streaming events. That verification gap already caught one live docs error (xAI documents grok-build as the model; the real default is grok-4.5), which is a fair warning about what else the docs may be wrong about. If you have either subscription, one issue from the verification template closes this gap. Full detail →

  • 🐛 agent_swarm antigravity workers died with "authentication timed out" on macOS — fixed (#2). Each swarm worker gets an isolated HOME so agy's per-process state can't collide. The module shipped asserting that auth survives it because agy reads credentials from the OS credential store — true on Windows (Credential Manager is keyed to the user session; re-verified on 1.1.12 that agy models inside a fake HOME returns the full list) and false on macOS, where the login keychain is resolved through $HOME. So every antigravity worker started a fresh OAuth flow and died at agy's 60 s authentication timed out, while antigravity_ask — which never touches HOME — kept working. Isolation is now conditional, decided two ways:

    • Proactively, by probing once per process: agy -p "/usage" inside a throwaway isolated HOME. On agy 1.1.11+ that's free (the CLI answers it, no agent turn, no quota), but the quota table comes from your account, so it can't be answered without working credentials. Skipped on Windows, where it can't fail.

    • Reactively, because a probe is a proxy and this one can't be tested on the platform it exists for: any worker that fails with an authentication signature flips the process to serialized mode and retries itself there, so you get an answer even if the probe was wrong or unavailable.

    In serialized mode the antigravity workers run in your real HOME behind the same lock the single-agent tools use — correct everywhere, at the cost of the parallelism (other backends stay parallel; a watched worker shows a note instead of live steps, since the step feed reads the isolated transcript). AGY_BRIDGE_NO_HOME_ISOLATION=1 forces it without a probe. Diagnosed by inspection from the report; not reproduced on a Mac — if you're on macOS, please confirm on #2.

  • 🐛 agy 1.1.11 killed the model argument — fixed (#3). agy made agy models machine-readable, turning each line from a bare slug into a tab-separated <slug>\t<human label> record (gemini-3.6-flash-high\tGemini 3.6 Flash (High)). The bridge read the whole line as the slug, so its up-front validation rejected every valid model with an error that listed the very slug it had just refused: unknown agy model 'gemini-3.6-flash-high'; expected one of: gemini-3.6-flash-high<TAB>Gemini 3.6 Flash (High), …. Reproduced end-to-end through antigravity_ask; model was unusable on all three antigravity tools (omitting it still worked — the default model path never touched this code). The parser now keeps the first tab field, which reads both formats, and drops any field containing whitespace (a slug never has a space, so such a line is chatter). Note 1.1.12's changelog advertises --output-format json for the models and agents subcommands, but the shipped binary has no such flag (agy models --output-format jsonflags provided but not defined: -output-format), so TSV is what there is to parse. The live slug list is unchanged from 1.1.6, and this suite stayed green through the break because every model test mocked the old format — the new tests pin both formats down. The change is in no changelog entry: the guard test was green on 1.1.10, #3 reports the break on 1.1.11, and it was reproduced here on 1.1.12.

  • antigravity_status now reports your remaining AI Pro quota — for free. agy 1.1.11/1.1.12 answer read-only slash commands in print mode itself: no agent turn, no quota spend, no conversation left behind (1.1.11: /usage, /quota, /credits, /model, /effort, /skills; 1.1.12: /permissions, /hooks, /help, /config, /changelog). The status tool runs agy -p "/usage" and adds a row per model family — quota: Gemini Models [ok] Weekly 100%, Five Hour 100% — flagging a family at 0% as a problem, since every call against it fails until its window resets. Version-gated at 1.1.11 as a safety gate: on older agy the same argv is a prompt, so a diagnostic advertised as free would quietly spend a call. The probe is the one bridge call that deliberately omits --disable-slash-commands (a regression test asserts it), and it degrades to nothing on older agy rather than reporting a false problem.

  • 🐛 codex's Windows sandbox refuses every command — and codex answers anyway. Re-verifying the bridge against codex 0.149.1 (from 0.144.1) turned up the worst failure shape there is: one that reports success. Under both read-only and workspace-write, every command codex tried came back rejected: blocked by policy — down to pwd — because the policy engine can't classify the pwsh -Command <...> wrapper codex itself builds. Shell commands are how codex reads files, so it saw nothing of the workspace. It did not say so. Asked for the version in a local pyproject.toml declaring 0.27.0, it ran a web search and answered 1.2.0, a version from an unrelated GitHub repository; a second run said 0.1.0. With the sandbox off, the same prompt answered 0.27.0. Exit 0 and a full -o file every time. Not local: there is no exec policy in this machine's config.toml, and it is open upstream (#40060, #38886).

    The bridge can't fix a CLI that reports success, but it no longer passes the result off as sound: any answer whose run had commands refused now comes back with a visible [agent-intern] WARNING naming the count and the policy. It appends rather than raises on purpose — under read-only a model that tries to write is supposed to be blocked, and that run's answer is perfectly good; what was unacceptable was the silence.

  • 🐛 codex_continue was broken outside a git repo — fixed. codex exec resume enforces the trusted-directory check just like a fresh run, and the bridge passed --skip-git-repo-check only on fresh runs, on the reasoning that resume inherits the session's recorded cwd and sandbox. So a continue in a plain directory died with "Not inside a trusted directory and --skip-git-repo-check was not specified" — while the fresh ask that created that very session had just succeeded. It only bit outside a git repo, which is why a green hermetic suite and everyday use inside a project never saw it; the test that covered this argv actively asserted the flag was absent. codex exec resume --help lists it, so the fix is the supported one. Re-verified live: ask then continue in a non-git workspace now both answer.

  • Re-verified copilot on 1.0.80 (from 1.0.69) — eleven releases, nothing to change. The one entry that could have reached this bridge was 1.0.71's "reject malformed --allow-tool and --deny-tool patterns with an error message", since read-only mode is a pair of --deny-tool patterns. Re-verified live on 1.0.80: they still parse, a workspace file read answers, and a write is still refused ("Blocked: I can't write files in this environment", no file created). 1.0.79's BREAKING rename of the sandbox setting allowDevToolCachesallowDevToolAccess is a config key this bridge never reads.

  • agent_swarm honours sandbox on Antigravity workers — it used to ignore it. Every other backend took a per-task sandbox policy; Antigravity dropped the key on the floor, so {"backend": "agy", "sandbox": "read-only"} was a task that looked fenced and ran with nothing holding it back. Plan mode is the first thing agy has that can honour the request, so "read-only" now maps onto it, "danger-full-access" names the unrestricted posture out loud, and "workspace-write" raises rather than implying a scoping agy cannot do.

    Verified live on 1.1.20 in the parallel isolated-HOME path — the one that builds its own argv rather than going through _run_agy, so it had to be threaded explicitly — with both workers in a single swarm running the same cmd /c echo RAN > <absolute path>: the read-only worker created nothing and returned a plan document, the unfenced one created its file. The version gate and the slash-command guard run at task-normalization time, so a bad plan request fails the whole swarm up front rather than N calls in.

    Two deliberate omissions. An omitted sandbox still leaves an agy worker unrestricted, unlike every other backend: flipping that default would silently turn existing file-writing swarm tasks into plan documents. And schema is not wired into the swarm at all — both Antigravity swarm paths read the answer from the isolated transcript, where structured_output does not exist, so it would mean moving the most load-bearing read path in the swarm onto JSON stdout. The structured-output caveat below is the other half of that reasoning: a schema that follows field order rather than content, run across N parallel workers, is N confidently wrong answers.

  • ⚠️ schema returns structured output — and agy fills it in a pass that doesn't re-read the question. Passing a JSON Schema to antigravity_ask / antigravity_continue maps to agy 1.1.8's --json-schema, and the tool returns agy's structured_output — exactly the declared fields, as JSON text you can json.loads. Note the prose response on the same run is not the same thing: it carries the model's raw emission, agy's internal toolAction / toolSummary keys, and sometimes a sentence of prose ahead of the JSON. A run that yields no structured output raises rather than handing you prose to parse.

    The caveat is worth more than the feature. agy populates the schema in a finishing pass that does not reason about the content again, so any field the turn never actually established gets guessed from the shape of the schema. Measured on 1.1.20, classifying "this broke my build and wasted my whole afternoon":

    prompt

    schema

    result

    plain classify request

    enum: ["positive","negative"]

    positive — 3 runs out of 4

    plain classify request

    same enum, order reversed

    negative — 2 of 2

    same, plus a reason field

    reason first, then the enum

    reason came back "Completed sentiment classification task."

    "state the verdict and why, then report it"

    the original, biased enum

    negative — 3 of 3

    It was following field order, not the sentence. So use schema to shape an answer the turn has already worked out — extraction, formatting, pulling fields out of something the model just read — and do not delegate the judgment itself to it. Ask for the reasoning in the prompt; the schema is the envelope, not the thinker.

  • Re-verified on agy 1.1.21–1.1.25 — the only drift was the model catalog, and it moved in both directions. Five releases, re-checked live on Windows. Plumbing all held: antigravity_ask round-tripped through the real argv on both the default-model path and an explicit --model, the --output-format json object still carries conversation_id / status / response, agy models still emits <slug>\t<label>, the /usage quota table still parses, and the JSONL transcript read path still resolves. What changed is data, not code:

    • gemini-3.8-flash arrived and took the default (gemini-3.8-flash-{low,medium,high}). Its changelog entry scopes it to "when connecting with a GEMINI_API_KEY", but it is in the catalog on ordinary AI Pro browser auth too, and --model gemini-3.8-flash-high round-tripped clean.

    • The whole gemini-3.5-flash family was dropped, and no changelog entry says so. 1.1.22 was still naming 3.5 Flash in a fix, so this is the same class of silent catalog change as the 1.1.11 TSV break — every 3.5 example in these docs had quietly become a guaranteed rejection.

    Nothing broke, because validation reads the live list rather than a baked-in one; the two guard tests added after the last drift are what fired, one per direction. Two upstream fixes also landed on shapes this bridge depends on, both moving toward it: 1.1.23 fixed subcommands such as models hanging on an inherited, unclosed stdin — the exact hang list_agy_models has always spawned with a closed stdin to dodge — and 1.1.24 fixed headless runs with piped stdout/stderr hanging on exit, which is every call this bridge makes. One false alarm worth knowing: agy leaves an empty conversation directory behind when it self-updates, and antigravity_status reports it as newest transcript [!!]. The read path is fine — the next real call writes a transcript and the row goes green. VERIFIED_AGY_VERSION(1, 1, 25).

  • Re-verified on agy 1.1.13–1.1.20 — no code change needed, and two upstream fixes moved toward the bridge. Eight releases of drift, re-checked live on Windows: antigravity_ask and antigravity_continue both round-tripped through the real argv (the continue pinned its conversation and recalled a codeword), agy's --output-format json object still carries conversation_id / status / response, agy models still emits <slug>\t<label>, the /usage quota table still parses into per-family rows, and all three version gates (supports_json_output, supports_disable_slash_commands, supports_print_usage) resolve true. The two changes that touch this bridge both make it more correct:

    • 1.1.18 made a valueless -p and a stray trailing argument hard errors. That is precisely the mis-parse the bridge is built to avoid — --print --sandbox 'do the task' used to run with the prompt --sandbox and the sandbox silently off. The bridge already passes the prompt as -p's value and already appends -p last, so nothing changed here except that agy now enforces the rule instead of failing quietly. Re-verified with a prompt whose first character is a dash.

    • Print-mode exit codes got honest, in both directions. 1.1.18 made a dropped agent stream exit non-zero rather than reporting a clean success with an empty response; 1.1.20 stopped treating benign tool errors and permission denials as fatal. The bridge raises on any non-zero exit, so both edits sharpen a signal it was already trusting.

    Also worth knowing, though nothing here had to move: 1.1.13 fixed two long-standing hazards in exactly the code path this bridge falls back to — transcript corruption when a background message appended while context compaction was rewriting it (which left JSON that no longer parsed) and unbounded growth of the on-disk conversation database. That fallback is the bridge's most fragile read path, and it is now sturdier upstream. 1.1.14 and 1.1.20 also shifted agy's default permission posture (workspace reads auto-granted under the default review mode; access outside the workspace narrowed to read-only) — --dangerously-skip-permissions stays load-bearing, so the Security note is unchanged.

    Docs-only drift, now fixed: agy grew the gemini-3.7-flash family and moved the default onto it, so an untouched install runs gemini-3.7-flash-high, not the gemini-3.6-flash-high every doc here named (verified in a throwaway HOME with no settings.json at all). Nothing broke — validation reads the live list — but the guard test only ever noticed a model agy dropped, which is why a whole new family and a moved default sailed through a green suite. A second guard now fails when agy offers a family the docs don't mention. VERIFIED_AGY_VERSION(1, 1, 20). Not adopted, and not exercised beyond confirming agy still lists them: --json-schema, 1.1.15's --input-format stream-json (one process, many turns), --mode accept-edits|plan, and 1.1.16's agy mcp subcommands. Nothing here needs them today.

  • Re-verified the rest of agy 1.1.11/1.1.12 — nothing else broke. The slash shield still holds: 1.1.11 replaced the silent fall-through for interactive-only commands with an explicit refusal that recommends the exact flag this bridge already passes (agy -p "/clear" → exit 2, "pass --disable-slash-commands to send /clear to the model as literal text"), and antigravity_ask("/clear Reply with the single word BRIDGE…") returned BRIDGE end-to-end. The read-only set is why the shield stays load-bearing — unshielded, a prompt opening with /model would get agy's table instead of an answer. 1.1.12 also stopped swallowing startup diagnostics (including the --conversation not-found warning the continue path can trigger): they go to stderr, so stdout stays a pure JSON result object — verified with a deliberately bogus --conversation (exit 0, clean JSON, warning on stderr). Benign wins: a Windows crash resolving the conversation transcript path is fixed (the artifact watch mode's log_uri points at), headless -p now settles a choice itself instead of stalling on a question nobody can answer (fewer timeouts), and 1.1.11 made retries honor the server's retry delay and stopped an empty credits response reading as "Out of credits". VERIFIED_AGY_VERSION(1, 1, 12). --effort stays unadopted, now with a harder reason: it isn't universal — --model claude-sonnet-4-6 --effort low fails with "--effort is not supported for model", while the gemini slugs already bake the level in. Everything else (Vim editing mode, artifact-viewer polish, plugin enablement, admin controls and MCP progress callbacks — agy as an MCP client) is off the bridge's path.

  • 🛡️ agy 1.1.9 broke print mode for any prompt starting with a slash — fixed by --disable-slash-commands. 1.1.9 made -p expand slash commands and skills instead of sending them to the model as text, so a prompt whose first token names a registered command is executed as that command and never reaches the model. Verified live on 1.1.10 through this bridge: antigravity_ask("/help") came back with agy's own help page, not an answer. That is not just wrong output — agy's registered set includes side-effecting commands (/goal starts an autonomous long-running task, /schedule creates cron jobs), and bridge prompts routinely carry text the caller did not author, so an untrusted string beginning /schedule … would have run it. Every agy argv path now passes --disable-slash-commands (one change in _agy_base_args covers ask, continue, both watched runners, and both swarm workers). Version-gated: the flag doesn't exist before 1.1.9, and neither does the expansion. Prompts starting with a POSIX path (/etc/hosts …) were never affected — they match no command — but that was luck, not a boundary. Set AGY_BRIDGE_ALLOW_SLASH_COMMANDS=1 to keep the expansion if you want -p "/my-skill <args>" to invoke a skill.

  • 🐛 Non-ASCII answers were being mangled on Windows — fixed. Every backend emits UTF-8, but the bridge spawned them with bare text=True, which decodes using the locale codepage (locale.getpreferredencoding() — cp1254 on a Turkish Windows, cp1252 elsewhere). Any non-ASCII answer came back corrupted: dosyası arrived as dosyası, exactly 'dosyası'.encode('utf-8').decode('cp1254'). Every bridge plus the swarm workers now decode UTF-8 explicitly with errors="replace", the pattern cursor_bridge.py already used. A regression test asserts no subprocess call reintroduces bare text=True. ASCII-only answers were never affected, which is why this survived so long.

  • Re-verified on agy 1.1.9 and 1.1.10. Beyond the slash-command break above: 1.1.10 fixed --model/--effort being silently ignored in headless -p (they were applied after model configuration had already initialized, so the run fell back to the persisted/default model). The bridge validates and passes --model on every call, so on 1.1.8–1.1.9 the model argument was a no-op even though a typo was still correctly rejected — if you pinned a model in that window, you were served the default. Re-confirmed working on 1.1.10 through the bridge (model="claude-sonnet-4-6" → a Claude answer, not Gemini). No code change was needed for it. 1.1.10 also added a non-blocking advisory banner when the same conversation is open in another CLI instance — the shape antigravity_continue and the swarm can produce — so _parse_json_result now locates the result object instead of requiring stdout to start with {; leading and trailing chatter are both absorbed rather than degrading into a raw JSON blob in your answer. VERIFIED_AGY_VERSION(1, 1, 10). Nothing else in 1.1.9/1.1.10 reaches the bridge — the rest is interactive-TUI, hooks, auth, and MCP-client work.

  • Verified on agy 1.1.7 and 1.1.8 — nothing broke, and 1.1.8 made the bridge sturdier. 1.1.8 gave print mode an --output-format flag (text | json | stream-json). The existing text path was confirmed live on 1.1.8 first (ask, pinned continue, and --model all clean), then the bridge switched its plain ask/continue calls to --output-format json, because reading a contractual response field beats trusting the layout of bare text. The real prize is the conversation_id agy returns with it: the bridge records it and pins a later antigravity_continue to exactly the conversation it last ran in that workspace, instead of inferring it from last_conversations.json — shared state agy rewrites for every session, including your own interactive TUI work in the same folder. Practical difference: antigravity_continue now resumes the bridge's own thread, where before it could land on a conversation you'd since started in the Antigravity TUI. Older agy is unaffected — the flag is version-gated (pre-1.1.8 has no such flag), and any non-JSON stdout falls back to the previous text path, so a silently-ignored flag degrades instead of crashing. VERIFIED_AGY_VERSION(1, 1, 8). Not adopted: --json-schema (works; nothing here needs it). Nothing else in 1.1.7/1.1.8 reaches the bridge — the rest is interactive-TUI, plugin-hook, and MCP-client work.

  • Watch mode reads agy's live event stream instead of scraping its transcript. On agy 1.1.8+ the watched runners request --output-format stream-json and consume agy's typed init / step_update / result events straight off stdout. Verified before the rewrite that they arrive incrementally (a 17 s run spread its 18 events over 12.4 s), and confirmed live that a watched run's step count grows while agy works. The stream carries the real command as a nested object (the transcript stored tool args JSON-encoded inside a string), streaming text fragments, and a conversation_id — so a watched run now pins later continues just like a plain one. This retires the timer-based transcript polling, which matters beyond tidiness: agy has announced JSONL is being replaced by SQLite, and watch was the last path that would have broken when it goes. Pre-1.1.8 agy keeps the original transcript path, re-verified live.

  • ⚠️ Behavior change: multi-step answers now include the model's narration. agy's response is the whole turn; the old transcript scrape returned only the last planner response. Identical for a single-step ask, different for a chatty multi-step one (one measured run: 297 chars vs 128, the full answer ending in the old one). The full turn is now returned on every path — response is agy's own contract for what the turn produced, and the old last-step rule silently dropped content whenever the model did the work and then closed with a short "Done."

  • Re-verified on agy 1.1.6 — no code change needed. 1.1.6 added the gemini-3.6-flash family to agy models and moved the settings.json default to Gemini 3.6 Flash (High); the default path and --model gemini-3.6-flash-high both round-tripped clean, and the JSONL + SQLite read paths still match agy's unchanged conversation schema. Its one bridge-adjacent fix — print mode now surfacing the real conversation-creation error instead of a misleading "no active conversation" — only improves the diagnostic the bridge already reads on failure. Everything else (Markdown custom agents, /copy and /codesearch polish, background-task hardening) is interactive-TUI or client-side work that doesn't reach the bridge. Docs-only: the model list and default examples now name the 1.1.6 slugs, and the guard test advertises gemini-3.6-flash-high against the live list.

  • ⚠️ Verified on agy 1.1.5 — it renamed every model, so old model values now fail. 1.1.5 replaced agy's human-readable model labels with stable slugs, and agy models reports only those: "Gemini 3.1 Pro (High)" is now gemini-3.1-pro-high, and the Claude entries are claude-sonnet-4-6 and claude-opus-4-6-thinking (the mapping is not 1:1 — check agy models, or antigravity_status, for the current list). Since the bridge validates model against agy models, an old label is rejected up front with the valid list — you lose the call, not your money, and never silently run on the wrong model. Pass slugs and you're fine. Nothing in the bridge's machinery needed changing (validation was always format-agnostic — which is exactly why the entire test suite stayed green while every documented example went stale), so this release is docs plus one new test that checks the models we advertise against the live agy models list. Everything else in 1.1.5 is interactive-TUI, MCP-client, or background-task work that doesn't reach the bridge; its new --effort flag is a second axis we don't pass, because the slug already pins the effort variant.

  • Verified on agy 1.1.4 — no code change was needed. 1.1.4 relaxed the 1.1.3 headless gate so that -p now honors your persisted settings.json policies (permissions, file access, sandbox mode, auto-execution, artifact review) instead of blanket-denying. --dangerously-skip-permissions still overrides those policies, so the flag stays load-bearing and stays exactly where it is — re-verified live against a workspace deliberately absent from trustedWorkspaces, with a permissions.allow list naming neither file nor command access: a workspace file read returned the right contents, and a terminal command and a file write both executed. Worth knowing: that flag is now the only thing between a bridge call and your own settings.json policy, and dropping it would get you whatever that file says rather than 1.1.3's deny-everything. 1.1.4 also stopped /btw side-questions from leaking into the conversation list as duplicates carrying the parent's title — that list is what conversation pinning reads, so one way to resume the wrong thread is gone.

  • Verified on agy 1.1.3 — base dir, last_conversations.json (still keyed by workspace path), the brain/.../transcript.jsonl path, the transcript schema, and the -p/-c/--print-timeout flags are all unchanged; a live antigravity_ask + conversation-pinned antigravity_continue round-trip returns clean over stdout and antigravity_status diagnostics pass. 1.1.3 broke and the bridge fixed the one thing that mattered: headless -p no longer auto-approves tool calls, it soft-denies them (print mode cannot prompt), so without a flag even "read pyproject.toml and report the version" returned nothing — exit 0, empty stdout, the reason only on stderr. The bridge now passes --dangerously-skip-permissions on every agy path, which restores file writes, terminal commands and workspace reads (a live bridge round-trip reads this repo's real version again). The flag must precede -p, whose value is the prompt — otherwise the flag becomes the prompt and the task is silently dropped. 1.1.2 also made an unresolvable --model hard-fail in -p instead of silently falling back to the settings.json default (the bridge's validate_model still rejects a typo up front, without spending a call). 1.1.0's execution-mode system (--mode, request-review) remains a no-op for the bridge: -p is spawned with DEVNULL stdin, so that interactive gate never engages. --sandbox behavior is likewise unchanged (blocks the terminal, not file writes). The print-mode stdout path (fixed on 1.0.15, Windows) still applies; the transcript stays the fallback.

  • Verified on codex-cli 0.144.1codex exec, -o/--output-last-message, codex exec resume, the --json event stream, and the ~/.codex/sessions/.../rollout-*.jsonl layout the continue path reads are all in place; a live codex_ask round-trip + codex_status pass. (Bumped from the 0.141.0 baseline: flags, session layout and the round-trip all re-verified unchanged.)

  • Verified on copilot 1.0.69copilot -p -s (clean stdout answer), --session-id set-then-resume, --model, --output-format json (watch stream), and the ~/.copilot/session-state/<id>/workspace.yaml layout the continue fallback reads are all in place; live copilot_ask / copilot_continue round-trips + a mixed agent_swarm pass. (Bumped from 1.0.68: 1.0.69 adds a --resume convenience flag the bridge doesn't need; --session-id still both sets a fresh id and resumes it — re-verified live, ACK then codeword recall.)

  • Verified on cursor-agent 2026.07.23cursor-agent -p --output-format text --trust (clean stdout answer), create-chat + -p --resume <id>, --model (validated against cursor-agent models), --output-format stream-json (watch stream), and the ~/.cursor/chats/<md5(workspace)>/<chat-id>/meta.json layout the continue fallback reads are all in place; live cursor_ask / cursor_continue round-trips + a mixed agent_swarm pass.

    The deferred live round-trip has since been done, on that same 2026.07.23. It had been skipped the first time because the Cursor account was at its usage limit, leaving the run path confirmed only by structure. End-to-end through the bridge now: cursor_ask read a workspace file and answered from it, cursor_continue resumed the pinned chat and recalled it, and a read-only run refused to write — "I'm in Ask mode … I can't create or write files", no file created — so cursor's agent-enforced mode holds in practice and not just in --help. Every model id the docs name still validates against the live list, which has grown from 193 ids to 204 with no CLI release: the catalogue moves on its own, so cursor-agent models stays the only current answer.

  • 🖥️ Console-detach — before 1.0.15 agy -p wrote its answer to the controlling terminal, not stdout; under a TUI that text leaked into the host's prompt (seen on 1.0.9). 1.0.15 fixed this on Windows (stdout now carries the answer), but the bridge still spawns agy detached (CREATE_NO_WINDOW / a new POSIX session), which prevents the leak on older/other platforms and is harmless on 1.0.15+.

  • 💾 SQLite migration — handled — agy still dual-writes a .db per conversation; on the fallback path, when the JSONL transcript is absent (already true for --sandbox runs, and the announced future default) _read_response falls back to reading the .db, verified to match across 100+ conversations. See the FAQ.

  • 🐛 agy stdout bug — fixed on 1.0.15-p now prints the clean answer to stdout in a non-TTY subprocess (Windows), so the bridge prefers stdout and only scrapes the transcript when stdout is empty (older agy, non-Windows, or --sandbox). (Codex and Copilot never had this problem — both are stdout-native.)

  • 👁️ Watch mode is experimental — pass watch=true to any single-prompt tool to open the Agent Intern window and watch the agent work live (coarse steps; image shown inline). Best-effort and cross-platform; see Watch mode.

  • 🔒 Sandbox — agy's --sandbox blocks only shell commands, so it's no boundary and the bridge never passes it. Codex's sandbox is real and enforced — use it; default read-only. Copilot's sandbox is best-effort (tool/path denials, not an OS sandbox); default read-only. Cursor's sandbox is agent-enforced (mode/force; read-only = --mode ask makes write/shell unavailable, not an OS sandbox); default read-only. See Security.

Requirements

  • Python 3.10+

  • For the Antigravity tools: agy 1.0.0+ on PATH (state-file layout re-verified on 1.0.15; behaviour re-verified on 1.1.25) and an active Antigravity / AI Pro session

  • For the Codex tools: codex on PATH and logged in (codex login) — verified on codex-cli 0.149.1 (note its Windows sandbox caveat)

  • For the Copilot tools: copilot on PATH and logged in (copilot/login, or a COPILOT_GITHUB_TOKEN/GH_TOKEN env) — verified on copilot 1.0.80

  • For the Cursor tools: cursor-agent on PATH and logged in (cursor-agent login, or a CURSOR_API_KEY env) — verified on cursor-agent 2026.07.23

  • For the Grok tools (experimental): grok on PATH and logged in (grok login, or an XAI_API_KEY env) plus a SuperGrok / X Premium+ subscription — flag surface verified on grok 1.0.3, answer path unverified

  • For the Kimi tools (experimental): kimi on PATH and logged in (kimi login, or an API key in ~/.kimi-code/config.toml) — flag surface verified on kimi 0.29.1, answer path unverified

Each backend is independent — install only the CLI(s) you plan to use; the other tools simply report "not found" via their *_status tool.

TIP

Ifagy isn't reliably on PATH (e.g. a new terminal or reboot drops it on Windows), set the AGY_BIN env var to its full path and the bridge will use that instead of "agy" — e.g. AGY_BIN=%LOCALAPPDATA%\agy\bin\agy.exe. Likewise, set CODEX_BIN if codex isn't reliably on PATH (the native Windows installer puts it under %LOCALAPPDATA%\Programs\OpenAI\Codex\bin\), and **COPILOT_BIN** if copilot isn't (the winget install lands under %LOCALAPPDATA%\Microsoft\WinGet\Packages\GitHub.Copilot_*\copilot.exe). Finally, set **CURSOR_BIN** if cursor-agent isn't reliably on PATH (the installer drops a cursor-agent.CMD shim a bare name can't launch on Windows). **GROK_BIN** and **KIMI_BIN** do the same for the two experimental backends — though the Grok bridge already falls back to the installer's own ~/.grok/bin on a PATH miss, which matters because that installer appends to the user PATH and the change never reaches an already-running server.

The bridge uses only cross-platform Python (Path.home(), subprocess) and reads paths under ~/.gemini/antigravity-cli/, ~/.codex/, ~/.copilot/, ~/.cursor/, ~/.grok/, and ~/.kimi-code/, which the CLIs write the same way on every OS. Developed and verified on Windows; macOS and Linux should work unmodified provided the CLIs run there. If you test it on those platforms, please open an issue / PR to confirm.

🌐 Community & Acknowledgments

💡 Path Resolution Fix: Thanks to their community's real-world testing, we identified and resolved a Windows PATH edge case where the MCP server inherits a stale PATH at startup and can't find agy. The AGY_BIN environment-variable fallback was implemented directly inspired by their report!

License

MIT. Do whatever you want with it.

Available Tools

21 tools
agent_swarmAgent swarm (mixed Antigravity + Codex + Copilot + Cursor, parallel)A

Run SEVERAL tasks IN PARALLEL across ALL backends in a single swarm.

Each task is its own worker and names the backend to run on, so one swarm can mix Antigravity (Gemini), Codex, Copilot, Cursor, and Grok workers — they run truly concurrently (capped at max_concurrency) and every answer comes back in one labelled block. A worker that fails is reported in place; the others still return.

SECURITY: this launches N unsandboxed agents at once — N times the prompt-injection surface of a single call (see the module SECURITY note). Only use it with trusted prompts on trusted content.

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYesOne object per parallel worker: - backend: "antigravity" (alias "agy"/"gemini"), "codex", "copilot" (alias "gh"/"github"), "cursor", or "grok" (alias "xai"; EXPERIMENTAL — see grok_ask) (required) - prompt: the question or instruction (required) - workspace: working dir for that worker (default: server cwd) - sandbox: "read-only" (default), "workspace-write", or "danger-full-access". Codex's is an enforced OS sandbox everywhere; Grok's is enforced on Linux/macOS only; Copilot's and Cursor's are agent/tool-level, not OS boundaries — see copilot_ask / cursor_ask / grok_ask. ANTIGRAVITY is the odd one: "read-only" maps to agy's plan mode (it investigates and writes a plan instead of editing files or running commands — see antigravity_ask's `plan`, and note it is agent-enforced, and needs agy 1.1.12+), "danger-full-access" states plainly that the worker is unrestricted, and "workspace-write" is REFUSED because agy has no write scoping to offer. Omitting it leaves an Antigravity worker unrestricted — that is the long-standing default, unlike every other backend here, so fence it explicitly if you want it fenced. - model: optional model override for ANY backend — Codex's `-m`, Copilot's/Cursor's `--model`, Grok's `-m`, or Antigravity's `--model` (an agy slug like "claude-sonnet-4-6"; validated against each backend's model list). Omit for each backend's default.
watchNoIf true, open the live "Agent Swarm" dashboard window (one row per worker, with a backend badge; click a row for its full step log).
timeout_sNoPer-worker timeout in seconds. Default 180.
max_concurrencyNoMax workers running at once (default 4). Higher = faster but more quota/rate-limit pressure and more agents at once.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses meaningful behavior beyond the annotations: workers run "truly concurrently," results return "in one labelled block," failed workers are "reported in place," and successful ones still return. The security warning about "N unsandboxed agents" and the prompt-injection surface adds important context that aligns with openWorldHint=true and readOnlyHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a front-loaded purpose statement, a brief explanation of worker behavior, and a clearly separated security warning. Every sentence earns its place and none merely repeats the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, high-risk tool with an output schema and 100% schema coverage, the description covers the essential invocation context: parallel execution, backend mixing, failure behavior, concurrency cap, and security caveats. Nothing critical is missing for an agent to decide whether and how to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds useful behavioral meaning for the tasks parameter — that each task is its own worker, names a backend, and can mix backends in one swarm — and clarifies that max_concurrency caps real parallelism. It does not add much on the other parameters, but the schema already documents them thoroughly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and scope: "Run SEVERAL tasks IN PARALLEL across ALL backends in a single swarm." This clearly distinguishes agent_swarm from the single-backend sibling tools like antigravity_ask or codex_ask, and the title reinforces the mix of backends and parallel execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: multiple tasks, multiple backends, parallel execution. It also provides an explicit exclusion: "Only use it with trusted prompts on trusted content." However, it does not explicitly name single-task sibling tools as alternatives, leaving the when-not-to-use guidance slightly incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

antigravity_askAsk Antigravity (new conversation)A

Ask Antigravity (agy CLI, Gemini by default) a question in a NEW conversation.

Uses your existing AI Pro authentication (silent-auth via Windows Credential Manager). Returns the model's final response as text. Good for fast tool-calling and short tasks; for heavier reasoning pick a bigger model or use the host model directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
planNoIf true, run agy in PLAN mode (agy 1.1.12+): it investigates and writes an implementation plan instead of touching anything. Verified on 1.1.20 that a file write and a shell command are both refused and diverted into a plan document under agy's own directory — even when the prompt insists, and even though the bridge still passes --dangerously-skip-permissions — while file READS answer normally. Use it to point Antigravity at a repo you don't want it editing. Two caveats. It is agent-enforced, not an OS sandbox: it constrains agy's agent loop, so treat it as a strong default rather than a boundary you'd rely on against a hostile prompt (Codex has the real one — see codex_ask's sandbox, and its Windows caveat: as of codex 0.149.1 a sandboxed run there refuses every command and answers anyway). And it is exclusive with the bridge's slash-command shield, because agy silently disables plan mode when that shield is on; a prompt whose first token is a slash command is therefore rejected up front rather than run. Raises on agy older than 1.1.12, which ignores --mode in print mode, rather than silently running your prompt unrestricted. Default false.
modelNoOptional model slug to run this conversation on (agy's --model), e.g. "gemini-3.1-pro-high" or "claude-sonnet-4-6". Omit to use the model set in agy's settings.json (gemini-3.8-flash-high as of agy 1.1.25). Must be one of `agy models` — an unknown slug is rejected up front (agy would otherwise silently ignore it and fall back to the default). agy 1.1.5 replaced the old human labels ("Gemini 3.1 Pro (High)") with these slugs, and the default has since moved to the gemini-3.8-flash family; the old form is no longer accepted. Note 1.1.25 also DROPPED the gemini-3.5-flash family with no changelog entry, so a 3.5 slug you saw in older docs is now rejected. See antigravity_status / `agy models` for the valid slugs.
watchNoIf true, open a live "watch" view in your browser that streams agy's steps (narration + the real commands it runs) as it works. agy still runs headless; the same final text is returned. Best- effort and cross-platform — if the browser can't open, the run completes normally. Default false.
promptYesQuestion or instruction for Antigravity.
schemaNoOptional JSON Schema (an object, or its JSON text). When given, agy is asked to produce output matching it (agy 1.1.8's --json-schema) and this tool returns the VALIDATED OBJECT as JSON text instead of prose — json.loads it. What comes back is agy's own `structured_output`, which carries exactly the declared fields; agy's prose `response` on the same run also picks up its internal toolAction/toolSummary keys and can be prefixed with a sentence, so the two are NOT interchangeable. If agy produces no structured output the call RAISES rather than handing back prose you would have to parse anyway. Needs agy 1.1.8+. IMPORTANT — write the prompt so the ANSWER is in the turn, and let the schema only shape it. agy fills the schema in a finishing pass that does not re-reason about the content, so a field the turn never established gets guessed from the schema itself. Measured on 1.1.20 with "this broke my build and wasted my whole afternoon": with enum ["positive","negative"] it answered "positive" 3 times out of 4, and simply REVERSING the enum to ["negative","positive"] flipped it to "negative" 2 out of 2 — it was following field order, not the sentence. Adding a `reason` field did not help; the reason came back "Completed sentiment classification task." Asking the prompt to state the verdict and why, and keeping the same biased enum, was correct 3 out of 3. So: extraction of what the model has already worked out is reliable; a judgment delegated to the schema is not.
timeout_sNoMax seconds to wait for agy to complete. Default 180.
workspaceNoWorking directory for the conversation. Defaults to cwd. Choose an existing project dir for context-aware responses.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false, openWorldHint=true), the description adds authentication context (silent-auth via Windows Credential Manager) and the text-return behavior. The plan and watch parameter descriptions go further by disclosing that agy can run shell commands/write files and what plan mode blocks; the only minor gap is that the main description does not itself warn that the default mode may mutate the workspace.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main description is four sentences with the core purpose front-loaded, and every sentence adds value: identity, auth, return type, and usage guidance. No filler or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Between the main description and the very rich input schema, an agent has everything needed to invoke the tool safely: authentication, default model, return format, side-effect caveats, version requirements, error/raise behavior, and workspace semantics. The output-schema signal covers return-value documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter descriptions are unusually detailed (plan-mode caveats, model slug rules, JSON-schema behavior, watch, timeout, workspace), so the main description need not add parameter meaning. It does not go beyond the schema here, earning the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource ('Ask Antigravity ... a question in a NEW conversation') and adds the concrete identity 'agy CLI, Gemini by default'. It also states the output contract ('Returns the model's final response as text'), which separates it from continuation and status siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit placement guidance: 'Good for fast tool-calling and short tasks; for heavier reasoning pick a bigger model or use the host model directly.' The emphasized 'NEW conversation' also tells an agent to reserve this tool for fresh conversations rather than antigravity_continue.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

antigravity_continueContinue Antigravity conversationA

Continue the Antigravity conversation rooted at this workspace.

Resumes the exact conversation id recorded for workspace (via agy's --conversation flag), not agy's global "most recent", so it stays correct even if agy was used elsewhere in between. On agy 1.1.8+ that id is the one agy itself reported for this bridge's last run in the workspace, so a follow-up resumes THIS thread even if you have since started a separate conversation in the same folder from Antigravity's own interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
planNoIf true, run this turn in agy's PLAN mode (1.1.12+) — it investigates and writes an implementation plan instead of editing files or running commands, while reads still work. Per-invocation like `model`, so a follow-up can plan even if the original ask was unrestricted. See antigravity_ask's `plan` for what it does and does not guarantee. Default false.
modelNoOptional model slug for this turn (agy's --model), e.g. "claude-sonnet-4-6". agy's model is per-invocation, not baked into the conversation, so a follow-up can run on a different model than the original ask — omit to use agy's settings.json default. Validated against `agy models`; an unknown slug is rejected (agy would silently ignore it).
watchNoIf true, open a live "watch" view in your browser that streams agy's steps as it works (same return value, best-effort). Default false.
promptYesFollow-up message.
schemaNoOptional JSON Schema for this turn — returns the validated object as JSON text instead of prose. Per-invocation like `model` and `plan`. See antigravity_ask's `schema`. Needs agy 1.1.8+.
timeout_sNoMax seconds to wait for agy to complete. Default 180.
workspaceNoWorking directory used by the prior conversation. Defaults to cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal mutating, open-world, non-idempotent behavior. The description adds useful behavioral context: the exact conversation id routing, version-dependent behavior on agy 1.1.8+, and the guarantee that it resumes THIS thread even if a separate conversation was started in the same folder. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, purposeful paragraphs. The first states the core purpose; the second adds a necessary edge-case clarification about global 'most recent' versus the exact conversation thread. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 100% schema coverage, rich per-parameter descriptions, an output schema, and safety/open-world annotations, the description only needs to disambiguate conversation routing behavior, which it does thoroughly. It is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a detailed description, so the tool description does not need to explain parameters. It adds some conceptual context about how workspace maps to the recorded conversation id, but the schema carries the semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: 'Continue the Antigravity conversation rooted at this workspace' and explains it resumes the exact conversation id recorded for the workspace. This clearly distinguishes it from starting a new ask and from other sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The first sentence frames when to use the tool, and the second paragraph clarifies that it uses the workspace-recorded conversation id rather than agy's global 'most recent', preventing common misuse. It does not explicitly name antigravity_ask as the alternative for starting new conversations, so it stops short of full when/not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

antigravity_imageGenerate an image with AntigravityA

Generate an image with Antigravity (Gemini image model via agy CLI).

Drives agy to produce a raster image on your existing AI Pro quota, saves it, and returns the absolute file path plus its real format and byte size. The host can then read the path to view the image.

agy picks the image format itself (JPEG for photo-like images, PNG for flat graphics), so the returned path's extension is corrected to match the actual bytes (a requested out.png may come back as out.jpg). Runs a normal, unsandboxed agy session — same privileges/caveats as the other tools (see the module SECURITY note).

ParametersJSON Schema
NameRequiredDescriptionDefault
watchNoIf true, open the live "watch" window that streams agy's steps and shows the finished image inline (same return value, best-effort). Default false.
promptYesDescription of the image to generate.
timeout_sNoMax seconds to wait for agy to complete. Default 240 (image generation is slower than text).
workspaceNoWorking directory for the conversation. Defaults to cwd.
output_pathNoWhere to save. Absolute, or relative to `workspace`. If omitted, a timestamped name under `workspace` is used.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint false, openWorldHint true), the description adds valuable behavioral context: it consumes AI Pro quota, saves the image, returns path/format/size, and notes that the extension may be corrected. It also mentions unsandboxed session and same privileges as other tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two paragraphs that front-load the main purpose. Every sentence adds essential information (quota, file output, format behavior, security note). No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers key aspects: output details (path, format, byte size), format selection, execution context (unsandboxed, same privileges), and quota usage. It references a security note from elsewhere. An output schema exists but is not shown; still, the description sufficiently explains return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description adds minimal extra detail for parameters. It restates that output_path can be absolute/relative and timeout_s default is 240, but these are already in the schema. The format correction note is a minor addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool generates an image using Antigravity (Gemini image model via agy CLI). It distinguishes itself from sibling tools like antigravity_ask (text generation) and antigravity_image_swarm by focusing on single image generation with file saving.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the tool's behavior (quota usage, file path return) but does not explicitly state when to use this tool versus alternatives like antigravity_image_swarm. It lacks guidance on appropriate prompts or scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

antigravity_image_swarmGenerate several images in parallelA

Generate several images IN PARALLEL with Antigravity (one worker per prompt).

Like antigravity_image, but runs N image generations concurrently in isolated workers (capped at max_concurrency). Returns one block listing each image's final path/format/size (or its error). Extensions are corrected to the real bytes, exactly like antigravity_image. Same unsandboxed privileges/caveats as antigravity_swarm.

ParametersJSON Schema
NameRequiredDescriptionDefault
watchNoIf true, open the live dashboard; each finished image shows in its pane, and clicking a row opens that agent's window beside the dashboard.
promptsYesOne image description per parallel worker.
timeout_sNoPer-worker timeout in seconds. Default 240 (images are slower).
workspacesNoWorking directory per worker (same shorthand as antigravity_swarm).
output_pathsNoWhere to save each image (aligned to prompts). Omit to write timestamped files in the first workspace (or server cwd).
max_concurrencyNoMax workers running at once (default 4).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses file extension correction, concurrency limits, timeout, return format (path/format/size/error), and unsandboxed privileges. Annotations provide readOnlyHint and openWorldHint, which are consistent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, uses brief paragraphs, and avoids fluff. However, it repeats 'like antigravity_image' and could be slightly more streamlined.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description sufficiently covers behavioral details, parameter defaults, concurrency, and workspace handling. It is complete for a tool with 6 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and descriptions are thorough. The tool description adds little extra beyond what the schema already provides, such as the listing of return values but not parameter-specific details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates several images in parallel, differentiating from antigravity_image. It specifies each prompt runs in an isolated worker, and returns a block listing results. This distinguishes it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (for parallel image generation) and compares to antigravity_image and antigravity_swarm. However, it does not explicitly state when not to use it or mention alternatives like sequential generation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

antigravity_statusagy bridge diagnosticsA
Read-onlyIdempotent

Report diagnostics for the agy bridge setup (spends no AI Pro quota).

Reports the bridge's own version and whether a newer release is available (best-effort GitHub check; honors AGY_BRIDGE_NO_UPDATE_CHECK), then checks whether agy is on PATH (and its version/compat), how much AI Pro quota is left per model family (agy 1.1.11+ answers /usage in print mode for free — a family at 0% is reported as a problem, since every call against it will fail until its window resets), whether agy's state directories exist, whether the newest conversation transcript is readable, and whether the SQLite conversation store is present. Use this to debug empty or failed responses — or to see if the bridge itself is out of date, or if you are simply out of quota — before spending quota.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond the annotations (readOnly, idempotent): it states it spends no AI Pro quota, is a best-effort GitHub check honoring AGY_BRIDGE_NO_UPDATE_CHECK, details how 0% quota per family is reported as a problem, and lists filesystem checks. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a dense but well-organized paragraph with the main purpose front-loaded and usage guidance at the end. All details are relevant, though the long clauses and extensive list make it slightly less scannable than optimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description thoroughly covers all checks performed, including version-specific behavior, env-var handling, and edge cases like quota exhaustion. The usage guidance completes the picture, making it comprehensive for a no-parameter diagnostic tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema fully covers parameter semantics (baseline 4). The description adds no parameter-specific details, but none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Report diagnostics for the agy bridge setup', which is a specific verb+resource statement. It distinguishes from sibling status tools (codex_status, copilot_status) by explicitly targeting the agy bridge, and then details the specific checks performed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The final sentence provides explicit when-to-use guidance: 'Use this to debug empty or failed responses — or to see if the bridge itself is out of date, or if you are simply out of quota — before spending quota.' This is clear, but it does not name alternative tools or when-not-to-use, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

codex_askAsk Codex (new session)A

Ask OpenAI Codex (codex exec) a question or task in a NEW session.

Uses your existing Codex login (ChatGPT or API key — see codex login status). Returns the agent's final message as text, read from codex's --output-last-message file (no stdout scraping). Codex is a capable coding agent, so this suits heavier reasoning and real code work, not just cheap tool-calling. Point workspace at a real project dir for context-aware answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoOptional model override (`-m`); omit to use codex's configured default.
watchNoIf true, open a live "watch" view in your browser that streams codex's steps (reasoning, the commands it runs, file changes) from its `--json` event stream. codex still runs headless; the same final text is returned. Best-effort — if the browser can't open, the run completes normally. Default false.
promptYesQuestion or instruction for Codex.
sandboxNoFilesystem policy — "read-only" (default: reads and answers but writes nothing), "workspace-write" (may edit files under the workspace), or "danger-full-access" (no sandbox — avoid). `codex exec` has no interactive approval gate, so this is the real safety boundary; opt into write access deliberately. WINDOWS CAVEAT (codex 0.149.1): sandboxed runs there currently refuse EVERY command, both policies, down to `pwd` — codex's policy engine cannot classify the `pwsh -Command <...>` wrapper it builds. Shell commands are how codex reads files, so it sees none of the workspace and ANSWERS ANYWAY, from its own knowledge or a web search, with no hint that it read nothing. The bridge appends a visible "[agent-intern] WARNING" to any answer whose run had commands refused: if you see it, treat the answer as unsourced.read-only
timeout_sNoMax seconds to wait for codex to complete. Default 180.
workspaceNoWorking root for the session (`-C`). Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description adds meaningful behavioral details: the tool uses an existing Codex login, returns only the final message read from `--output-last-message`, and does not use stdout scraping. It also hints at potentially heavy execution with 'real code work.' No contradiction with annotations; some safety specifics live in parameter descriptions, but the core behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core action and session type. Every subsequent sentence earns its place—login prerequisite, output mechanism, use-case guidance, and workspace advice. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that launches a coding agent, the description covers the key operational context: new session, login requirement, output retrieval method, suitability for heavy reasoning, and workspace recommendation. An output schema exists, so return-value detail is not required, and the sandbox/window caveats are handled in the parameter descriptions. An agent has enough information to invoke it correctly and set expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself provides rich parameter descriptions (e.g., sandbox policies, watch behavior, timeout). The main description adds a small strategic tip about `workspace` ('Point workspace at a real project dir'), but otherwise does not need to compensate. This matches the baseline for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Ask OpenAI Codex a question or task in a NEW session.' It distinguishes this from siblings by emphasizing 'NEW session,' which clearly separates it from codex_continue and other agent ask tools. The additional context that it uses `codex exec` and returns the final message makes the tool's intent unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use it: 'suits heavier reasoning and real code work, not just cheap tool-calling.' It also advises pointing `workspace` at a real project directory for context-aware answers. However, it does not explicitly name alternatives or state when not to use it, so it falls just short of full exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

codex_continueContinue Codex sessionA

Continue the Codex session rooted at this workspace (codex exec resume).

Resumes the exact session id captured from the last codex_ask in this workspace, falling back to the newest on-disk session whose recorded cwd matches (so it still works after a server restart). The resumed session keeps its original sandbox and model — those are chosen when you start it with codex_ask.

ParametersJSON Schema
NameRequiredDescriptionDefault
watchNoIf true, open the live "watch" view streaming codex's steps as it works (same viewer as codex_ask). Default false.
promptYesFollow-up message for the existing session.
timeout_sNoMax seconds to wait for codex to complete. Default 180.
workspaceNoWorking root used by the prior session. Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral context beyond annotations: it explains session resumption logic, fallback behavior, and that the session keeps its original sandbox and model. No contradictions with annotations (readOnlyHint=false, idempotentHint=false, openWorldHint=true) are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two short paragraphs. The first sentence front-loads the primary purpose. Every sentence adds value, with no redundant or irrelevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 parameters, 1 required), schema coverage (100%), and the presence of an output schema, the description covers all key aspects: session identification, fallback, behavior after restart, and preservation of original settings. It is complete for an agent to correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add significant extra meaning for parameters beyond what is already in the input schema schema. It provides context around workspace defaults and timeout, but these are already described in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool continues an existing Codex session, using a specific command (`codex exec resume`). It distinguishes from sibling tools like codex_ask (which starts a session) and codex_status (status check), and explains the fallback behavior for session identification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (after codex_ask, to continue a session) and includes practical details like fallback after server restart. It does not explicitly state when not to use it or mention alternatives, but the context is clear enough for an agent to infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

codex_statusCodex bridge diagnosticsA
Read-onlyIdempotent

Report diagnostics for the Codex bridge setup (spends no quota).

Reports the bridge's own version and whether a newer release is available (best-effort GitHub check; honors AGY_BRIDGE_NO_UPDATE_CHECK) — the same update notice antigravity_status shows, so a Codex-only install still surfaces it — then checks whether codex is on PATH (and its version), whether you're logged in (codex login status — no model call, no quota), where codex stores its sessions, and how many workspace sessions are pinned this run. Use this to debug "codex not found" or auth errors before spending quota.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint and idempotentHint, but the description adds valuable context: confirms no quota spent, describes best-effort GitHub check with environment variable, and details each diagnostic check. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with a clear flow: purpose, detailed checks, usage note. Slightly long but every sentence adds value; could be more concise but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, rich annotations, and presence of output schema, the description fully explains what the tool does, its side effects (no quota), and when to use it. It covers all behavioral and contextual aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters with 100% coverage, so description does not need to add parameter details. Baseline score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports diagnostics for the Codex bridge setup, listing specific checks (version, update, PATH, login status, session storage, pinned sessions). It distinguishes from sibling status tools by referencing antigravity_status and focusing on Codex-specific debugging.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use: 'debug "codex not found" or auth errors before spending quota.' It also implies not to use for other bridges, and notes the tool spends no quota, making it safe to run.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copilot_askAsk GitHub Copilot (new session)A

Ask the GitHub Copilot CLI (copilot -p) a question or task in a NEW session.

Uses your existing Copilot login (OS credential store, or a COPILOT_GITHUB_TOKEN/GH_TOKEN/GITHUB_TOKEN env var — see copilot_status). Returns the agent's final message, read straight from stdout (the CLI's -s silent mode; no scraping). Copilot is a capable agentic coder — good for real code/repo work; point workspace at a project dir for context-aware answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoOptional model override (`--model`). Use "auto" to let Copilot pick. Which ids work is ACCOUNT-DEPENDENT and copilot exposes no non-interactive list, so the bridge cannot validate this the way the agy/cursor tools do — an unavailable id errors immediately with copilot's own message, costing a call. Prefer omitting it (your account default) or "auto" unless you know your plan's ids.
watchNoIf true, open a live "watch" view streaming copilot's steps from its `--output-format json` event stream. Same final text is returned. Best-effort. Default false.
promptYesQuestion or instruction for Copilot.
sandboxNoPermission policy (maps to copilot's tool/path flags): "read-only" (default — best-effort: denies the local write/shell tools; NOT an OS sandbox, so unlike codex it is not a hard boundary), "workspace-write" (may edit files, confined to the workspace), or "danger-full-access" (--allow-all — avoid).read-only
timeout_sNoMax seconds to wait for copilot to complete. Default 180. (Copilot's reasoning models can be slow; raise this if needed.)
workspaceNoWorking root for the session (`-C`). Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint false, openWorldHint true, idempotentHint false. Description adds useful behavioral details: uses existing login, returns stdout from CLI in silent mode, best-effort watch option, and notes sandbox is not a hard boundary. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with the key action and well-structured, though it could be slightly more concise without losing important details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 params, output schema, siblings), the description covers purpose, usage, parameters, and output. It lacks explicit error handling but is otherwise sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 6 parameters have schema descriptions (100% coverage), and the description adds context beyond schema, such as explaining model validation limitations, sandbox distinctions from codex, and workspace usage for context-aware answers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Ask the GitHub Copilot CLI a question or task in a NEW session,' specifying the verb, resource, and distinguishing from sibling tools like copilot_continue.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using the tool for real code/repo work with workspace context, and mentions alternatives like copilot_status for login. It warns about model validation errors, but could more explicitly say when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copilot_continueContinue GitHub Copilot sessionA

Continue the Copilot session rooted at this workspace (resumes its --session-id).

Resumes the exact session id the bridge set on the last copilot_ask in this workspace, falling back to the newest on-disk session whose recorded cwd matches (so it still works after a server restart). Unlike codex_continue, copilot re-applies permission flags on every call, so sandbox takes effect here too — e.g. analyze read-only with copilot_ask, then continue with "workspace-write" to apply the fix.

ParametersJSON Schema
NameRequiredDescriptionDefault
watchNoIf true, open the live "watch" view streaming copilot's steps (same viewer as copilot_ask). Default false.
promptYesFollow-up message for the existing session.
sandboxNoPermission policy for THIS turn (default "read-only"). Same values and caveats as copilot_ask.read-only
timeout_sNoMax seconds to wait for copilot to complete. Default 180.
workspaceNoWorking root used by the prior session. Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals behavioral traits beyond annotations: it resumes the exact session ID, falls back to the newest on-disk session, and re-applies permission flags each call. This adds value over the annotations (readOnlyHint=false, openWorldHint=true) which do not specify these details. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two short paragraphs. The first sentence immediately states the core purpose. The second paragraph adds crucial differentiation without redundancy. Every sentence provides value, and the information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema and high schema coverage, the description covers all necessary context: session resumption, workspace fallback, permission behavior, and comparison to codex_continue. It is complete for an AI agent to understand when and how to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds no extra parameter details beyond the schema, but it does reinforce that 'sandbox' takes effect here, which is already in the schema. The parameter meaning is well-covered by schema descriptions themselves, so no need for more.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool continues a GitHub Copilot session rooted at a workspace, resuming its session ID. It distinguishes itself from siblings like codex_continue by mentioning permission re-application. The title 'Continue GitHub Copilot session' further clarifies the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool: after a copilot_ask, and when you want sandbox permissions to take effect. It contrasts with codex_continue, but does not explicitly list scenarios where alternatives like antigravity_continue are preferred. The fallback behavior after restart is noted, providing context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copilot_statusCopilot bridge diagnosticsA
Read-onlyIdempotent

Report diagnostics for the Copilot bridge setup (spends no quota).

Reports the bridge's own version and whether a newer release is available (best-effort GitHub check; honors AGY_BRIDGE_NO_UPDATE_CHECK) — the same update notice antigravity_status shows, so a Copilot-only install still surfaces it — then checks whether copilot is on PATH (and its version), an auth hint (copilot has no login status command, so this is best-effort — an env token is reported when set, otherwise login via the credential store is assumed and unverified), where copilot stores session state, and how many workspace sessions are pinned this run. Use this to debug "copilot not found" or auth errors before a call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by disclosing the tool's best-effort nature: the GitHub check 'honors AGY_BRIDGE_NO_UPDATE_CHECK' and auth detection is 'best-effort' with specific caveats. It also notes that the update notice is the same as antigravity_status. No contradictions with annotations (readOnlyHint, idempotentHint).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It opens with a clear summary sentence, then bullet-points the diagnostics items without unnecessary words. Every sentence adds value, and the length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no input parameters and an output schema exists, the description covers all necessary behavioral context: what diagnostics are reported, edge cases (best-effort checks), and the intended debug use case. It is fully complete for the agent to understand and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% coverage, so the description does not need to explain parameters. The baseline of 4 is appropriate as the description adds no additional parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Report diagnostics for the Copilot bridge setup.' It details the specific items checked (version, update, PATH, auth, session state) and explicitly says to use it for debugging 'copilot not found' or auth errors. This distinguishes it from sibling status tools like antigravity_status by focusing on Copilot-specific diagnostics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Use this to debug "copilot not found" or auth errors before a call.' It also explains that the update notice matches antigravity_status, implying when to choose this over that. However, it does not explicitly state when not to use it or name alternative tools for other scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cursor_askAsk Cursor (new chat)A

Ask the Cursor CLI (cursor-agent -p) a question or task in a NEW chat.

Uses your existing Cursor login (OS credential store, or a CURSOR_API_KEY env var — see cursor_status). Returns the agent's final message, read straight from stdout (no scraping). Cursor is a capable agentic coder with a wide model menu (GPT / Claude / Grok / Composer); point workspace at a project dir for context-aware answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoOptional model override (`--model`, e.g. "auto", "gpt-5.2", "claude-opus-4-8-high", "composer-2.5"); validated against `cursor-agent models` and rejected on a typo. cursor bakes the effort and speed axes into the id (…-low/-high/-xhigh/-max, each with a -fast twin) and also accepts a bracket form on the family base, e.g. "claude-opus-4-8[context=1m,effort=high]". Omit to use your Cursor default.
watchNoIf true, open a live "watch" view streaming cursor's steps from its `--output-format stream-json` event stream. Same final text is returned. Best-effort. Default false.
promptYesQuestion or instruction for Cursor.
sandboxNoPermission policy (maps to cursor's mode/force flags): "read-only" (default — `--mode ask`: agent-enforced, no file/shell edits; NOT an OS sandbox, so unlike codex it is not a hard boundary), "workspace-write" (may edit files, rooted at the workspace), or "danger-full-access" (OS sandbox off — avoid).read-only
timeout_sNoMax seconds to wait for cursor to complete. Default 180.
workspaceNoWorking root for the chat (`--workspace`). Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate mutation and external access, and the description adds context: it uses Cursor CLI, returns stdout, explains sandbox modes (including agent-enforced but not hard boundary), and mentions streaming via watch. This provides valuable behavioral insight beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences in the first paragraph, front-loading the core purpose. Every sentence adds necessary context without redundancy. It is well-structured and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (6 parameters, output schema exists), the description covers purpose, authentication, return behavior, and basic use. It lacks explicit error handling or timeout details, but the schema covers most parameters. Overall, it provides sufficient context for an AI agent to use the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed parameter descriptions. The description adds value by noting that workspace enables context-aware answers and linking to cursor_status for auth, supplementing the schema. It does not repeat schema information unnecessarily.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Ask the Cursor CLI a question or task in a NEW chat', specifying the verb and resource. It distinguishes from sibling 'cursor_continue' by emphasizing 'new chat' and mentions return value and authentication, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for new conversations but does not explicitly state when not to use it or provide alternatives. It references 'cursor_status' for auth but lacks direct comparison with 'cursor_continue'. The guidance is implied but not explicit, warranting a mid-range score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cursor_continueContinue Cursor chatA

Continue the Cursor chat rooted at this workspace (resumes its chat id).

Resumes the exact chat id the bridge minted on the last cursor_ask in this workspace, falling back to the newest on-disk chat whose recorded cwd matches (so it still works after a server restart). cursor applies permission flags per invocation, so sandbox takes effect here too — e.g. analyze read-only with cursor_ask, then continue with "workspace-write" to apply the fix.

ParametersJSON Schema
NameRequiredDescriptionDefault
watchNoIf true, open the live "watch" view streaming cursor's steps (same viewer as cursor_ask). Default false.
promptYesFollow-up message for the existing chat.
sandboxNoPermission policy for THIS turn (default "read-only"). Same values and caveats as cursor_ask.read-only
timeout_sNoMax seconds to wait for cursor to complete. Default 180.
workspaceNoWorking root used by the prior chat. Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond annotations: it explains the resumption logic (exact chat id from last cursor_ask, fallback to newest chat with matching cwd), how permission flags apply per invocation, and that it works after server restart. No contradictions with annotations (readOnlyHint false, openWorldHint true, idempotentHint false).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two short paragraphs. The first sentence immediately states the core action. The second paragraph adds necessary detail without fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (5 parameters, output schema exists), the description covers all essential behavioral aspects: resumption logic, fallback, permission per invocation, and restart resilience. It does not need to explain output schema since it exists separately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description does not add new parameter-level semantics beyond what is already in the schema. It reiterates that sandbox takes effect, but does not provide additional details or context that enhance parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's action: 'continue the Cursor chat.' It uses specific verb ('continue') and resource ('Cursor chat'), and distinguishes from sibling tools like cursor_ask (which starts a new chat) and cursor_status (which shows status).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: after a cursor_ask to continue that chat. It also provides context on fallback behavior and permission handling, with an example usage scenario ('analyze read-only with cursor_ask, then continue with workspace-write'), guiding the agent on when and why to invoke this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cursor_statusCursor bridge diagnosticsA
Read-onlyIdempotent

Report diagnostics for the Cursor bridge setup (spends no quota).

Reports the bridge's own version and whether a newer release is available (best-effort GitHub check; honors AGY_BRIDGE_NO_UPDATE_CHECK) — the same update notice antigravity_status shows, so a Cursor-only install still surfaces it — then checks whether cursor-agent is found (and its version), whether you're logged in (cursor-agent status), and where cursor stores its chats. Use this to debug "cursor not found" or auth errors before spending quota.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so no contradiction. The description adds value by detailing the best-effort GitHub update check and the AGY_BRIDGE_NO_UPDATE_CHECK environment variable, providing useful behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is composed of four efficient sentences, front-loading the purpose and quota-free nature. Every sentence earns its place, with no redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, existing output schema, and thorough description of diagnostics reported, the description is fully complete for an agent to understand what the tool does and what it will return.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, schema coverage is 100% and baseline is 4. No additional parameter description needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Report diagnostics for the Cursor bridge setup' with specific resources (bridge version, cursor-agent, login status, chat storage). It distinguishes from sibling antigravity_status by noting the same update notice is shown, clarifying overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to debug cursor not found or auth errors before spending quota,' providing clear usage context. It lacks explicit when-not-to-use but is sufficient for a diagnostic tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

grok_askAsk Grok Build (new session) [experimental]A

Ask Grok Build (grok -p) a question or task in a NEW session. EXPERIMENTAL.

⚠️ Community-verified only: this bridge has never completed an authenticated round-trip, because the author has no Grok subscription. Its flags are verified against grok 1.0.3, but the answer path is not. If it misbehaves, say so rather than working around it — and please report it.

Needs a SuperGrok / X Premium+ login (grok login) or an XAI_API_KEY env var; run grok_status first to check. Returns the agent's final message, read from grok's --output-format json result. Point workspace at a project dir for context-aware answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoOptional model override (`-m`, e.g. "grok-4.5"); validated against `grok models` and rejected on a typo. Omit to use grok's default.
watchNoIf true, open a live "watch" view streaming grok's steps from its `--output-format streaming-json` event stream. Same final text is returned. Best-effort. Default false.
promptYesQuestion or instruction for Grok.
sandboxNoPermission policy (maps to grok's `--sandbox` profile plus a tool allowlist): "read-only" (default — the `read-only` profile, no write/shell tools, no subagents), "workspace-write" (the `workspace` profile: writes land in the workspace, ~/.grok and temp), or "danger-full-access" (profile `off` — avoid). ⚠️ grok's OS sandbox is LINUX/macOS ONLY (Landlock/Seatbelt); on Windows it is silently NOT enforced, so read-only there rests on the agent-enforced tool allowlist alone. For a hard boundary on every platform, use codex.read-only
timeout_sNoMax seconds to wait for grok to complete. Default 180.
workspaceNoWorking root (`--cwd`). Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses the experimental status ('has never completed an authenticated round-trip'), warns that it may misbehave and asks to report issues, and states it returns the agent's final message from `--output-format json`. This adds meaningful risk and behavior context not present in structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and experimental warning in the first paragraph; the second paragraph covers auth, output, and workspace usage. Each sentence is substantive, though slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the rich schema/annotations/output schema, and the experimental nature, the description covers the essential risk factors, auth, output, and workspace guidance. It is complete enough for an agent to decide and invoke it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover 100% of parameters with detailed explanations (e.g., sandbox profiles, watch streaming). The description adds no extra parameter meaning beyond a passing mention of workspace location, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Ask Grok Build (`grok -p`) a question or task in a NEW session.' This clearly distinguishes it from grok_continue (explicit 'NEW session') and grok_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states prerequisites ('Needs a SuperGrok / X Premium+ login... or an XAI_API_KEY env var'), directs the agent to 'run `grok_status` first,' and suggests pointing workspace at project dir for context-aware answers. It doesn't explicitly name the alternative for continuing sessions, but the 'NEW session' wording implies the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

grok_continueContinue Grok Build session [experimental]A

Continue the Grok session rooted at this workspace. EXPERIMENTAL.

Resumes the exact session id grok returned on the last grok_ask in this workspace (-r <id>), falling back to grok's own "most recent session for this cwd" (-c) when that in-memory pin is gone — so it still works after a server restart. grok applies permission flags per invocation, so sandbox takes effect here too: analyze read-only with grok_ask, then continue with "workspace-write" to apply the fix. Same experimental caveat and auth requirement as grok_ask.

ParametersJSON Schema
NameRequiredDescriptionDefault
watchNoIf true, open the live "watch" view streaming grok's steps (same viewer as grok_ask). Default false.
promptYesFollow-up message for the existing session.
sandboxNoPermission policy for THIS turn (default "read-only"). Same values and platform caveats as grok_ask.read-only
timeout_sNoMax seconds to wait for grok to complete. Default 180.
workspaceNoWorking root used by the prior session. Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses important behaviors: session pinning via grok_ask's id, fallback to cwd, persistence across server restarts, per-invocation permission flags, and the sandbox's effect. It also notes the experimental caveat and auth requirement, adding value over the structured annotations which only indicate openWorld and read-only state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a compact paragraph that front-loads the purpose and then provides necessary technical details. Each sentence contributes useful information — purpose, session mechanism, permission behavior, and experimental caveat — without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of a detailed input schema, annotations, and an output schema, the description is complete enough. It covers the core behavior, session continuity, permission handling, and caveats. It doesn't discuss edge cases like missing prior sessions, but the fallback mechanism partially addresses that, and the experimental tag signals volatility.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 5 parameters are fully described in the schema (100% coverage), so the description has little additional semantic burden. It adds one clarifying note that 'sandbox takes effect here too' and ties it to a workflow, but this is marginal relative to the schema's already explicit parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Continue the Grok session rooted at this workspace', which clearly specifies the verb (continue), the resource (Grok session), and the scope (rooted at this workspace). It further explains the mechanics (resuming via session id or fallback to cwd), distinguishing it from sibling tools like grok_ask and grok_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it is for continuing an existing session, references the companion grok_ask for read-only analysis, and explicitly recommends using 'workspace-write' to apply fixes. It lacks explicit 'when not to use' or named alternatives beyond grok_ask, but the workflow guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

grok_statusGrok bridge diagnosticsA
Read-onlyIdempotent

Report diagnostics for the Grok Build bridge setup (spends no quota).

Reports the bridge's own version and any newer release (the same update notice antigravity_status shows), then whether grok is found (and its version), whether you're authenticated, which models it offers, and where grok keeps its data. Auth and the model list both come from grok models, which answers even when logged out — so this is cheap and safe to call first.

Use this to debug "grok not found" or auth errors before spending quota. This backend is EXPERIMENTAL and unverified end-to-end, so a green status here means the setup looks right, not that a live answer has ever been confirmed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description reveals that no quota is consumed, that auth/model data come from `grok models` which answers even when logged out, and importantly warns that the backend is EXPERIMENTAL with unverified end-to-end behavior. These are valuable behavioral insights.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the key fact ('spends no quota'), structured into a clear overview, detailed output list, and usage guidance. Every sentence carries unique value and there is no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter diagnostic tool, the description fully covers its purpose, output scope, safety characteristics, usage context, and a crucial caveat about experimental status. The presence of an output schema makes the lack of explicit return-format details acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema requires no parameters, so the baseline is 4. The description compensates by explaining what the tool reports, which is more relevant to output than parameter semantics. No parameter information is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool's specific action ('Report diagnostics') and resource ('Grok Build bridge setup'), and immediately clarifies it spends no quota. It distinguishes itself from sibling tools like grok_ask/grok_continue by being a status/diagnostic tool, and even references antigravity_status for the update notice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Use this to debug "grok not found" or auth errors before spending quota.' It also positions itself as cheap, safe, and first to call, giving clear decision guidance relative to other tools that spend quota.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kimi_askAsk Kimi (new session) [experimental]A

Ask Kimi Code (kimi -p) a question or task in a NEW session. EXPERIMENTAL.

⚠️ Community-verified only — built without a Kimi account, so no authenticated round-trip has ever run and the author cannot verify it. It won't answer until you authenticate: run kimi login (device-code) or put an API key in ~/.kimi-code/config.toml, then check kimi_status. Returns the agent's final message, read straight from stdout. Kimi Code is Moonshot's terminal coding agent (Kimi K2 family); point workspace at a project dir for context-aware answers.

Kimi print mode has NO sandbox and auto-executes every tool call (like antigravity), so run it only with trusted prompts on trusted content.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoOptional model alias (`-m`, from ~/.kimi-code/config.toml); omit to use config's default_model. Not validated up front (Kimi has no `models` list), so a bad alias surfaces as Kimi's own run-time error.
promptYesQuestion or instruction for Kimi.
timeout_sNoMax seconds to wait for kimi to complete. Default 180.
workspaceNoWorking root (kimi's cwd). Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag readOnlyHint=false, openWorldHint=true, idempotentHint=false, but the description adds substantial behavioral context: the tool is experimental and community-verified only, no authenticated round-trip has ever been run, it requires authentication, reads output from stdout, and — critically — 'has NO sandbox and auto-executes every tool call (like antigravity).' This goes well beyond the annotations and fully warns the agent of the tool's dangerous side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every sentence contributes meaningful information: purpose, experimental status, auth steps, return format, what Kimi Code is, workspace tip, and a critical safety warning. It is front-loaded with the primary action and uses line breaks to separate warnings. Slightly verbose but justified by the tool's complexity and risk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's experimental, unauthenticated, and dangerous nature, the description is remarkably complete. It explains the output (agent's final message from stdout), prerequisites, the safety model (no sandbox, auto-execution), and how to get better results (workspace). The presence of an output schema reduces the need to describe return values, and the description covers the rest comprehensively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (model, prompt, timeout_s, workspace) are already documented. The description adds one useful hint for the workspace parameter ('point workspace at a project dir for context-aware answers'), but adds nothing new for prompt, model, or timeout_s. With high schema coverage, this marginal extra keeps it at baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pairing: 'Ask Kimi Code... a question or task in a NEW session.' This clearly distinguishes the tool from the sibling kimi_continue (which presumably continues a session) and kimi_status. It also names the underlying command (`kimi -p`) and states what it returns, making the tool's function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'in a NEW session' provides clear context for when to use this tool versus continuation alternatives, even though no alternative is explicitly named. It also gives prerequisites (authentication via `kimi login` or API key, then checking `kimi_status`) and a safety restriction ('run it only with trusted prompts on trusted content'). Missing an explicit 'use kimi_continue instead' but otherwise strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kimi_continueContinue Kimi session [experimental]A

Continue the Kimi session rooted at this workspace (kimi -c). EXPERIMENTAL.

Resumes the previous Kimi session for this workspace via -c/--continue — Kimi scopes sessions per working directory, so there's no id to track. Errors if no prior kimi_ask ran in this workspace. Same experimental caveat and auth requirement as kimi_ask.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesFollow-up message for the existing session.
timeout_sNoMax seconds to wait for kimi to complete. Default 180.
workspaceNoWorking root used by the prior session. Defaults to the server cwd.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as non-read-only, open-world, and non-idempotent. The description adds meaningful behavioral context: session scoping per working directory (no ID needed), error condition when no prior session exists, and experimental/auth caveats. This goes beyond basic annotations and helps an agent understand prerequisites and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loads the main purpose in the first sentence, and includes only essential details. No extraneous information or redundant restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (experimental, has prerequisites, multiple parameters) and the presence of an output schema and annotations, the description covers the critical context: how to use it, what will happen if misused, and the experimental nature. It's sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers all three parameters with clear descriptions (100% coverage). The description adds meaning by explaining the session scoping mechanism, which clarifies the 'workspace' parameter's purpose and why no session ID is required. This enriches the schema without radically changing it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resumes a prior Kimi session for the workspace via `kimi -c`. It distinguishes from siblings like kimi_ask (starting a new session) and kimi_status (checking status) by specifying the action and workspace scoping. The verb 'continue' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance by stating it errors if no prior kimi_ask was run, indicating when the tool is applicable. It also references the same experimental caveat and auth requirement as kimi_ask, framing the appropriate context. However, it doesn't explicitly contrast with alternatives like kimi_ask or kimi_status, so it falls just short of fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kimi_statusKimi bridge diagnosticsA
Read-onlyIdempotent

Report diagnostics for the Kimi bridge setup (spends no quota). EXPERIMENTAL.

Reports the bridge's own version and any newer release (same update notice antigravity_status shows), then checks whether kimi is found (and its version), whether a provider is configured (kimi provider list — the auth proxy, since Kimi needs kimi login or an API key in config.toml), and where Kimi stores its data. This backend is unverified, so expect the auth row to say "no providers configured" until you log in.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: 'spends no quota,' 'EXPERIMENTAL,' expected auth row prior to login, and backend unverified. These are behavioral traits not captured by readOnlyHint/idempotentHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear one-line summary. The subsequent paragraph is detailed but each sentence adds necessary caveats or specifics. Slightly verbose with backticks and examples, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations, the description provides complete context: purpose, cost (no quota), experimental status, expected caveats, and specific checks performed. No significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has zero parameters and schema coverage is 100% trivially. The description doesn't add parameter semantics, but none are needed; baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Report diagnostics for the Kimi bridge setup'. It enumerates concrete checks (version, newer release, kimi binary, provider, data location) and distinguishes it from sibling status tools by referencing antigravity_status's update notice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when checking bridge setup, notes 'spends no quota' as a benefit, and warns the backend is unverified. However, it does not explicitly state when to use this instead of kimi_ask/kimi_continue or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.29.1
    • Changedantigravity_ask1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model slug to run this conversation on (agy's --model),\n   e.g. \"gemini-3.1-pro-high\" or \"claude-sonnet-4-6\". Omit to use the\n   model set in agy's settings.json (gemini-3.7-flash-high by\n   default). Must be one of `agy models` — an unknown slug is\n   rejected up front (agy would otherwise silently ignore it and fall\n   back to the default). agy 1.1.5 replaced the old human labels\n   (\"Gemini 3.1 Pro (High)\") with these slugs, and the default has\n   since moved to the gemini-3.7-flash family; the old form is no\n   longer accepted. See antigravity_status / `agy models` for the\n   valid slugs."New value: +"Optional model slug to run this conversation on (agy's --model),\n   e.g. \"gemini-3.1-pro-high\" or \"claude-sonnet-4-6\". Omit to use the\n   model set in agy's settings.json (gemini-3.8-flash-high as of agy\n   1.1.25). Must be one of `agy models` — an unknown slug is\n   rejected up front (agy would otherwise silently ignore it and fall\n   back to the default). agy 1.1.5 replaced the old human labels\n   (\"Gemini 3.1 Pro (High)\") with these slugs, and the default has\n   since moved to the gemini-3.8-flash family; the old form is no\n   longer accepted. Note 1.1.25 also DROPPED the gemini-3.5-flash\n   family with no changelog entry, so a 3.5 slug you saw in older\n   docs is now rejected. See antigravity_status / `agy models` for\n   the valid slugs."
  2. 4 tool updatesv0.28.0
    • Changedagent_swarm1 field changed
      • changedInput schema / properties / tasks / description
        Previous value: -"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), \"cursor\", or \"grok\"\n              (alias \"xai\"; EXPERIMENTAL — see grok_ask) (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot/Cursor/Grok only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox\n              everywhere; Grok's is enforced on Linux/macOS only;\n              Copilot's and Cursor's are agent/tool-level, not OS\n              boundaries — see copilot_ask / cursor_ask / grok_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, Grok's `-m`, or\n              Antigravity's `--model` (an agy slug like\n              \"claude-sonnet-4-6\"; validated against each backend's\n              model list). Omit for each backend's default."New value: +"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), \"cursor\", or \"grok\"\n              (alias \"xai\"; EXPERIMENTAL — see grok_ask) (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: \"read-only\" (default), \"workspace-write\", or\n              \"danger-full-access\". Codex's is an enforced OS sandbox\n              everywhere; Grok's is enforced on Linux/macOS only;\n              Copilot's and Cursor's are agent/tool-level, not OS\n              boundaries — see copilot_ask / cursor_ask / grok_ask.\n              ANTIGRAVITY is the odd one: \"read-only\" maps to agy's\n              plan mode (it investigates and writes a plan instead of\n              editing files or running commands — see antigravity_ask's\n              `plan`, and note it is agent-enforced, and needs agy\n              1.1.12+), \"danger-full-access\" states plainly that the\n              worker is unrestricted, and \"workspace-write\" is REFUSED\n              because agy has no write scoping to offer. Omitting it\n              leaves an Antigravity worker unrestricted — that is the\n              long-standing default, unlike every other backend here,\n              so fence it explicitly if you want it fenced.\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, Grok's `-m`, or\n              Antigravity's `--model` (an agy slug like\n              \"claude-sonnet-4-6\"; validated against each backend's\n              model list). Omit for each backend's default."
    • Changedantigravity_ask3 fields changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model slug to run this conversation on (agy's --model),\n   e.g. \"gemini-3.1-pro-high\" or \"claude-sonnet-4-6\". Omit to use the\n   model set in agy's settings.json (gemini-3.6-flash-high by\n   default). Must be one of `agy models` — an unknown slug is\n   rejected up front (agy would otherwise silently ignore it and fall\n   back to the default). agy 1.1.5 replaced the old human labels\n   (\"Gemini 3.1 Pro (High)\") with these slugs and 1.1.6 added the\n   gemini-3.6-flash family; the old form is no longer accepted. See\n   antigravity_status / `agy models` for the valid slugs."New value: +"Optional model slug to run this conversation on (agy's --model),\n   e.g. \"gemini-3.1-pro-high\" or \"claude-sonnet-4-6\". Omit to use the\n   model set in agy's settings.json (gemini-3.7-flash-high by\n   default). Must be one of `agy models` — an unknown slug is\n   rejected up front (agy would otherwise silently ignore it and fall\n   back to the default). agy 1.1.5 replaced the old human labels\n   (\"Gemini 3.1 Pro (High)\") with these slugs, and the default has\n   since moved to the gemini-3.7-flash family; the old form is no\n   longer accepted. See antigravity_status / `agy models` for the\n   valid slugs."
      • addedInput schema / properties / plan
        Added value: +{
        +  "default": false,
        +  "description": "If true, run agy in PLAN mode (agy 1.1.12+): it investigates and\n  writes an implementation plan instead of touching anything. Verified\n  on 1.1.20 that a file write and a shell command are both refused and\n  diverted into a plan document under agy's own directory — even when\n  the prompt insists, and even though the bridge still passes\n  --dangerously-skip-permissions — while file READS answer normally.\n  Use it to point Antigravity at a repo you don't want it editing.\n  Two caveats. It is agent-enforced, not an OS sandbox: it constrains\n  agy's agent loop, so treat it as a strong default rather than a\n  boundary you'd rely on against a hostile prompt (Codex has the real\n  one — see codex_ask's sandbox, and its Windows caveat: as of codex\n  0.149.1 a sandboxed run there refuses every command and answers\n  anyway). And it is exclusive with the bridge's\n  slash-command shield, because agy silently disables plan mode when\n  that shield is on; a prompt whose first token is a slash command is\n  therefore rejected up front rather than run. Raises on agy older than\n  1.1.12, which ignores --mode in print mode, rather than silently\n  running your prompt unrestricted. Default false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / schema
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON Schema (an object, or its JSON text). When given, agy\n    is asked to produce output matching it (agy 1.1.8's --json-schema)\n    and this tool returns the VALIDATED OBJECT as JSON text instead of\n    prose — json.loads it. What comes back is agy's own\n    `structured_output`, which carries exactly the declared fields;\n    agy's prose `response` on the same run also picks up its internal\n    toolAction/toolSummary keys and can be prefixed with a sentence, so\n    the two are NOT interchangeable. If agy produces no structured\n    output the call RAISES rather than handing back prose you would\n    have to parse anyway. Needs agy 1.1.8+.\n\n    IMPORTANT — write the prompt so the ANSWER is in the turn, and let\n    the schema only shape it. agy fills the schema in a finishing pass\n    that does not re-reason about the content, so a field the turn never\n    established gets guessed from the schema itself. Measured on 1.1.20\n    with \"this broke my build and wasted my whole afternoon\": with\n    enum [\"positive\",\"negative\"] it answered \"positive\" 3 times out of 4,\n    and simply REVERSING the enum to [\"negative\",\"positive\"] flipped it\n    to \"negative\" 2 out of 2 — it was following field order, not the\n    sentence. Adding a `reason` field did not help; the reason came back\n    \"Completed sentiment classification task.\" Asking the prompt to state\n    the verdict and why, and keeping the same biased enum, was correct\n    3 out of 3. So: extraction of what the model has already worked out\n    is reliable; a judgment delegated to the schema is not."
        +}
    • Changedantigravity_continue2 fields changed
      • addedInput schema / properties / plan
        Added value: +{
        +  "default": false,
        +  "description": "If true, run this turn in agy's PLAN mode (1.1.12+) — it investigates\n  and writes an implementation plan instead of editing files or running\n  commands, while reads still work. Per-invocation like `model`, so a\n  follow-up can plan even if the original ask was unrestricted. See\n  antigravity_ask's `plan` for what it does and does not guarantee.\n  Default false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / schema
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional JSON Schema for this turn — returns the validated object as\n    JSON text instead of prose. Per-invocation like `model` and `plan`.\n    See antigravity_ask's `schema`. Needs agy 1.1.8+."
        +}
    • Changedcodex_ask1 field changed
      • changedInput schema / properties / sandbox / description
        Previous value: -"Filesystem policy — \"read-only\" (default: reads and answers but\n     writes nothing), \"workspace-write\" (may edit files under the\n     workspace), or \"danger-full-access\" (no sandbox — avoid). `codex\n     exec` has no interactive approval gate, so this is the real safety\n     boundary; opt into write access deliberately."New value: +"Filesystem policy — \"read-only\" (default: reads and answers but\n     writes nothing), \"workspace-write\" (may edit files under the\n     workspace), or \"danger-full-access\" (no sandbox — avoid). `codex\n     exec` has no interactive approval gate, so this is the real safety\n     boundary; opt into write access deliberately.\n\n     WINDOWS CAVEAT (codex 0.149.1): sandboxed runs there currently\n     refuse EVERY command, both policies, down to `pwd` — codex's\n     policy engine cannot classify the `pwsh -Command <...>` wrapper it\n     builds. Shell commands are how codex reads files, so it sees none\n     of the workspace and ANSWERS ANYWAY, from its own knowledge or a\n     web search, with no hint that it read nothing. The bridge appends\n     a visible \"[agent-intern] WARNING\" to any answer whose run had\n     commands refused: if you see it, treat the answer as unsourced."
  3. 7 tool updatesv0.26.0
    • Changedagent_swarm1 field changed
      • changedInput schema / properties / tasks / description
        Previous value: -"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), or \"cursor\" (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot/Cursor only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox; Copilot's\n              and Cursor's are agent/tool-level, not OS boundaries — see\n              copilot_ask / cursor_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, or Antigravity's `--model`\n              (an agy slug like \"claude-sonnet-4-6\"; validated\n              against each backend's model list). Omit for each\n              backend's default."New value: +"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), \"cursor\", or \"grok\"\n              (alias \"xai\"; EXPERIMENTAL — see grok_ask) (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot/Cursor/Grok only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox\n              everywhere; Grok's is enforced on Linux/macOS only;\n              Copilot's and Cursor's are agent/tool-level, not OS\n              boundaries — see copilot_ask / cursor_ask / grok_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, Grok's `-m`, or\n              Antigravity's `--model` (an agy slug like\n              \"claude-sonnet-4-6\"; validated against each backend's\n              model list). Omit for each backend's default."
    • Addedgrok_ask
    • Addedgrok_continue
    • Addedgrok_status
    • Addedkimi_ask
    • Addedkimi_continue
    • Addedkimi_status
  4. 2 tool updatesv0.22.1
    • Changedcopilot_ask1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model override (`--model`, e.g. \"gpt-5.3-codex\"); omit to\n   use your account's default. An unavailable model errors immediately."New value: +"Optional model override (`--model`). Use \"auto\" to let Copilot pick.\n   Which ids work is ACCOUNT-DEPENDENT and copilot exposes no\n   non-interactive list, so the bridge cannot validate this the way the\n   agy/cursor tools do — an unavailable id errors immediately with\n   copilot's own message, costing a call. Prefer omitting it (your\n   account default) or \"auto\" unless you know your plan's ids."
    • Changedcursor_ask1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model override (`--model`, e.g. \"gpt-5.2\", \"sonnet-4-thinking\",\n   \"auto\"); validated against `cursor-agent models` and rejected on a\n   typo. Omit to use your Cursor default."New value: +"Optional model override (`--model`, e.g. \"auto\", \"gpt-5.2\",\n   \"claude-opus-4-8-high\", \"composer-2.5\"); validated against\n   `cursor-agent models` and rejected on a typo. cursor bakes the effort\n   and speed axes into the id (…-low/-high/-xhigh/-max, each with a\n   -fast twin) and also accepts a bracket form on the family base, e.g.\n   \"claude-opus-4-8[context=1m,effort=high]\". Omit to use your Cursor\n   default."
  5. 3 tool updatesv0.21.4
    • Changedagent_swarm1 field changed
      • changedInput schema / properties / tasks / description
        Previous value: -"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), or \"cursor\" (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot/Cursor only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox; Copilot's\n              and Cursor's are agent/tool-level, not OS boundaries — see\n              copilot_ask / cursor_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, or Antigravity's `--model`\n              (an agy label like \"Claude Sonnet 4.6 (Thinking)\";\n              validated against each backend's model list). Omit for\n              each backend's default."New value: +"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), or \"cursor\" (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot/Cursor only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox; Copilot's\n              and Cursor's are agent/tool-level, not OS boundaries — see\n              copilot_ask / cursor_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, or Antigravity's `--model`\n              (an agy slug like \"claude-sonnet-4-6\"; validated\n              against each backend's model list). Omit for each\n              backend's default."
    • Changedantigravity_ask1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model label to run this conversation on (agy's --model),\n   e.g. \"Gemini 3.1 Pro (High)\" or \"Claude Sonnet 4.6 (Thinking)\".\n   Omit to use the model set in agy's settings.json (Gemini 3.5 Flash\n   (High) by default). Must be one of `agy models` — an unknown label\n   is rejected up front (agy would otherwise silently ignore it and\n   fall back to the default). See antigravity_status / `agy models`\n   for the valid labels."New value: +"Optional model slug to run this conversation on (agy's --model),\n   e.g. \"gemini-3.1-pro-high\" or \"claude-sonnet-4-6\". Omit to use the\n   model set in agy's settings.json (gemini-3.6-flash-high by\n   default). Must be one of `agy models` — an unknown slug is\n   rejected up front (agy would otherwise silently ignore it and fall\n   back to the default). agy 1.1.5 replaced the old human labels\n   (\"Gemini 3.1 Pro (High)\") with these slugs and 1.1.6 added the\n   gemini-3.6-flash family; the old form is no longer accepted. See\n   antigravity_status / `agy models` for the valid slugs."
    • Changedantigravity_continue1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model label for this turn (agy's --model). agy's model is\n   per-invocation, not baked into the conversation, so a follow-up can\n   run on a different model than the original ask — omit to use agy's\n   settings.json default. Validated against `agy models`; an unknown\n   label is rejected (agy would silently ignore it)."New value: +"Optional model slug for this turn (agy's --model), e.g.\n   \"claude-sonnet-4-6\". agy's model is per-invocation, not baked into\n   the conversation, so a follow-up can run on a different model than\n   the original ask — omit to use agy's settings.json default.\n   Validated against `agy models`; an unknown slug is rejected (agy\n   would silently ignore it)."
  6. 4 tool updatesv0.21.0
    • Changedagent_swarm1 field changed
      • changedInput schema / properties / tasks / description
        Previous value: -"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\", or\n              \"copilot\" (alias \"gh\"/\"github\") (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox; Copilot's\n              is best-effort tool/path permissions — see copilot_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's `--model`, or Antigravity's `--model` (an agy\n              label like \"Claude Sonnet 4.6 (Thinking)\"; validated\n              against `agy models`). Omit for each backend's default."New value: +"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\",\n              \"copilot\" (alias \"gh\"/\"github\"), or \"cursor\" (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot/Cursor only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox; Copilot's\n              and Cursor's are agent/tool-level, not OS boundaries — see\n              copilot_ask / cursor_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's/Cursor's `--model`, or Antigravity's `--model`\n              (an agy label like \"Claude Sonnet 4.6 (Thinking)\";\n              validated against each backend's model list). Omit for\n              each backend's default."
    • Addedcursor_ask
    • Addedcursor_continue
    • Addedcursor_status
  7. 6 tool updatesv0.15.4
    • Changedagent_swarm1 field changed
      • changedInput schema / properties / tasks / description
        Previous value: -"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\") or \"codex\" (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex only — \"read-only\" (default), \"workspace-write\",\n              or \"danger-full-access\". Ignored for Antigravity.\n   - model:   Codex only — model override (`-m`). Ignored for Antigravity."New value: +"One object per parallel worker:\n   - backend: \"antigravity\" (alias \"agy\"/\"gemini\"), \"codex\", or\n              \"copilot\" (alias \"gh\"/\"github\") (required)\n   - prompt:  the question or instruction (required)\n   - workspace: working dir for that worker (default: server cwd)\n   - sandbox: Codex/Copilot only — \"read-only\" (default),\n              \"workspace-write\", or \"danger-full-access\". Ignored for\n              Antigravity. (Codex's is an enforced OS sandbox; Copilot's\n              is best-effort tool/path permissions — see copilot_ask.)\n   - model:   optional model override for ANY backend — Codex's `-m`,\n              Copilot's `--model`, or Antigravity's `--model` (an agy\n              label like \"Claude Sonnet 4.6 (Thinking)\"; validated\n              against `agy models`). Omit for each backend's default."
    • Changedantigravity_ask1 field changed
      • addedInput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional model label to run this conversation on (agy's --model),\n   e.g. \"Gemini 3.1 Pro (High)\" or \"Claude Sonnet 4.6 (Thinking)\".\n   Omit to use the model set in agy's settings.json (Gemini 3.5 Flash\n   (High) by default). Must be one of `agy models` — an unknown label\n   is rejected up front (agy would otherwise silently ignore it and\n   fall back to the default). See antigravity_status / `agy models`\n   for the valid labels."
        +}
    • Changedantigravity_continue1 field changed
      • addedInput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional model label for this turn (agy's --model). agy's model is\n   per-invocation, not baked into the conversation, so a follow-up can\n   run on a different model than the original ask — omit to use agy's\n   settings.json default. Validated against `agy models`; an unknown\n   label is rejected (agy would silently ignore it)."
        +}
    • Addedcopilot_ask
    • Addedcopilot_continue
    • Addedcopilot_status
  8. 5 tool updatesv0.12.2
    • Addedagent_swarm
    • Removedantigravity_swarm
    • Addedcodex_ask
    • Addedcodex_continue
    • Addedcodex_status
  9. 6 tool updatesv0.11.0
    • First observedantigravity_ask
    • First observedantigravity_continue
    • First observedantigravity_image
    • First observedantigravity_image_swarm
    • First observedantigravity_status
    • First observedantigravity_swarm

TDQS

A4.3/5.0
Disambiguation5/5

Each tool is clearly distinguished by backend and action: ask starts a new session, continue resumes the workspace-rooted session, and status reports diagnostics. The parallel swarm tools are also clearly separated by whether they handle tasks or images.

Naming Consistency4/5

The dominant pattern <backend>_ask / _continue / _status is applied consistently across all six backends. A few outliers (antigravity_image, antigravity_image_swarm, agent_swarm) deviate from the verb-action convention, but they remain readable and internally patterned.

Tool Count4/5

21 tools is above the typical 3–15 range, but the server intentionally spans six backends, each needing ask/continue/status plus image and swarm operations. The count is heavy yet justified, with little redundancy.

Completeness4/5

Each backend has a complete new-session/resume/diagnose lifecycle, plus additional image and parallel-swarm capabilities. Minor gaps exist, such as no direct way to list or inspect past conversation history, but normal workflows have no dead ends.

Maintenance

ActivityNo data
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP server that spawns autonomous Claude Code agents in GitHub repos, enabling task delegation with persistent state, multi-step workflows, and job monitoring.
    47
    94
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that lets Claude Code call the Google Antigravity CLI (agy) headlessly for a second opinion from a different model family, or to have agy read project files on Claude's behalf so large files never enter Claude's context window.
    407
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that bridges CLI coding agents like Claude Code, Codex, opencode, and Antigravity into any MCP client, enabling synchronous and asynchronous task execution, follow-up input, and a structured code review tool.
    151
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SinanTufekci/agent-intern'

If you have feedback or need assistance with the MCP directory API, please join our Discord server