Elyra
Elyra The coding agent eTerm The terminal that knows where each command ends Starf An activity monitor for Apple silicon that never invents a number etrans An SSH and SFTP client for macOS Elyra VM Virtual machines for macOS, Linux and Windows on your Mac Litr A small, native web browser for macOS Notr A notebook for macOS e The native code editor Elyra Grove Native local development environment Askr The real server for Laravel & PHP Elyra Framework Rust + Svelte 5 framework for desktop apps Elyra Conductor Local project conductor Refr Local-first PDF workspace for macOS Elyra Workspace A desktop workspace for coding agents Elyra SQL Server MySQL-compatible SQL server in Rust Elyra Félagi Agents as teammates on one board Elyra SQL Client Native desktop SQL workbench Elyra SQL Anywhere Replication-ready SQL engine Elyra Sjá SEO & GEO workspace for macOS Elyra DataGrid Server-driven data grid for Laravel
Internals
Architecture
Release notes
Changelog
Elyra
AI tools (MCP server)

AI tools (MCP server)

Grove ships a built-in Model Context Protocol server, so AI tools like Claude and Cursor can see your local environment and answer questions about it — live. Because Grove already knows your sites, proxies every request, and can read each project's database, it can hand an AI assistant a rich, accurate picture of what's actually running on your machine, with zero per-project setup.

It's read-only and runs entirely on your machine — nothing is sent anywhere except to the AI client you connect.

Start it

grove mcp

That runs an MCP server over stdio (newline-delimited JSON-RPC). You normally don't run it by hand — your AI client launches it for you.

Connect your client

Claude Desktop — edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "grove": { "command": "grove", "args": ["mcp"] }
  }
}

Cursor — add an MCP server in settings, or .cursor/mcp.json:

{
  "mcpServers": {
    "grove": { "command": "grove", "args": ["mcp"] }
  }
}

If grove isn't on your PATH, use the full path to the binary (for the desktop app that's /Applications/Grove.app/Contents/MacOS/grove, or install the shims with grove path install so grove resolves everywhere). Restart the client after editing its config.

What the AI can do

Tool What it answers
grove_sites Every site Grove serves (host, driver, PHP/Node, HTTPS, path).
grove_requests Recent requests across sites — method, path, status, duration.
grove_routes Per-route timing: each route's typical and recent time, and the routes that got slower, with a request id to look at.
grove_request Full headers + body of one captured request, with credentials redacted (see below).
grove_request_chain The causal chain for one request — the SQL it issued (with grove sql-capture on) and mail it sent within its time window, plus derived metrics (duration, query count).
grove_explain A curated debugging bundle for one request — the request (headers + body), its causal chain, and matching error-log entries with stacktraces. Everything needed to explain a failing request.
grove_webhooks Recently captured inbound webhooks.
grove_logs List log sources, or read recent Laravel / service log entries.
grove_db_schema Tables and columns for a site's database (read from its .env).
grove_db_query Run a read-only SQL query and return rows.

What is redacted

Grove is the proxy, so it sees every request in full. Anything these tools hand back has its credentials replaced with [redacted] first:

  • Headers — Authorization, Cookie, Proxy-Authorization, X-Api-Key and any header whose name contains token, secret, password, api-key, credential or private-key.
  • Query parameters and body fields with those same names, in JSON and form-encoded bodies. JSON is re-serialised, so the result is still valid JSON.

Names are kept, only values are replaced — a request that carried an Authorization header still looks like one.

Two limits worth knowing:

  • A body Grove cannot parse (multipart, protobuf, something truncated mid-token) is passed through untouched. Redaction narrows the exposure; it does not eliminate it.
  • Webhook signatures (Stripe-Signature, X-Hub-Signature) are not redacted. They authenticate a payload rather than granting access, and they are usually the thing you are debugging when you look at a webhook.

grove replay and grove hooks replay are unaffected: they use a separate in-process path that keeps the real credentials, or the replayed request would not be the same request.

So you can ask your assistant things like:

  • "What routes does myapp have a controller for, and what did the last 500 error there look like?"
  • "Show me the schema for the orders table in shop."
  • "Show me the full chain for request #42 — how many queries did it run and did it send any email?" (turn on grove sql-capture on first for SQL)
  • "Explain request #42 — why did it 500?" (uses grove_explain to pull the request, its queries, and the stacktrace together)
  • "How many users signed up today?" (it runs a SELECT for you)
  • "What webhook did Stripe just send, and did my handler 200?"

Agent-safe write tools (opt-in)

By default the server is read-only. Start it with --allow-write to expose tools that can change state — each one wrapped in a safety net so an agent can never leave your database in a broken state:

grove mcp --allow-write
Tool What it does
grove_migrate_sandboxed Runs php artisan <command> (default migrate --force) inside an automatic snapshot sandbox.
grove_sql_sandboxed Runs a write SQL statement (INSERT/UPDATE/DELETE/DDL) inside the same snapshot sandbox. Read-only statements are refused — use grove_db_query.

Both support MySQL, PostgreSQL and SQLite.

How grove_migrate_sandboxed works:

  1. Grove takes a point-in-time snapshot of the site's database first.
  2. It runs the migration and captures the schema diff (added/removed tables and columns).
  3. If the command fails, Grove automatically rolls back to the snapshot — your data is untouched.
  4. Pass roll_back: true for a pure dry run: it runs, reports what the migration would change, then rolls back even on success.
  5. On success it keeps the change and returns the snapshot_id so you can roll back manually at any time.

Works with MySQL, PostgreSQL (snapshotted via Grove's daemon) and SQLite (snapshotted by copying the .sqlite file). Every write operation is appended to an audit log at $GROVE_HOME/logs/mcp-writes.log (what ran, when, the snapshot id, and the outcome).

grove_sql_sandboxed follows the exact same snapshot → run → diff → rollback flow for a single write statement, returning rows_affected alongside the schema diff.

Both sandboxed write tools also return a chain — the SQL the operation actually ran and any mail it sent, correlated to the operation's time window (the same causal-chain shape used for requests). This is the blast radius: you can see everything a migration touched before deciding to keep it. Grove turns on SQL capture for the duration of the operation automatically (MySQL) and restores your previous capture setting afterwards.

So you can safely ask: "Add the migration for the invoices table and apply it", "Do a dry run of migrate:fresh and show me what tables it would create," or "Backfill users.status to 'active' where it's null — but roll back so I can review first."

Sandboxes: a whole running copy to work in

The snapshot tools protect your database while an agent changes it. A sandbox goes further: the agent never touches your checkout or your database at all.

Tool What it does
grove_sandbox_open Makes a new branch from the site's current commit (or checks out an existing one with existing: true) in a separate git worktree, gives it its own copy of the database, runs composer install and the migrations, and serves it at its own HTTPS URL.
grove_sandbox_close Removes the sandbox's site, database copy and worktree. The branch and its commits stay for you to review. Refuses, listing the files, while there is uncommitted work, unless force: true.
grove_sandbox_list Lists what is running (read-only, available without --allow-write).

grove_sandbox_open returns the sandbox's own site name, and every other tool takes it: grove_db_query, grove_requests, grove_request_chain, grove_logs, grove_migrate_sandboxed. So the agent edits files under the returned path, runs its migrations through Grove, and then looks at what the running app actually did against its own data, not just at its diff:

{
  "site": "myapp--agent-add-notes",
  "branch": "agent/add-notes",
  "url": "https://myapp--agent-add-notes.test",
  "path": "~/.grove/try/myapp/agent-add-notes",
  "database": {"engine": "mysql", "name": "myapp__gt_929546f2"}
}

Nothing reaches your checkout until you merge the branch. A sandbox is the same thing as grove try, so grove try --list shows the agent's sandboxes too, and grove try --done <branch> closes one by hand. Opening and closing are logged to mcp-writes.log like every other write.

Safety

  • Read-only by default. Write tools appear only with grove mcp --allow-write, and even then the server refuses them if the flag is off.
  • Sandboxed writes. Every write goes through a snapshot with automatic rollback on failure, plus an audit log.
  • grove_db_query refuses anything that isn't a SELECT / SHOW / EXPLAIN / PRAGMA.
  • Local only. The server talks to Grove's local daemon and your local databases; it makes no outbound network calls.
  • Requires the Grove daemon to be running (grove start).

See also: Commands · Request timeline.