<p>There's a funny gap in how we work with AI coding assistants. They can read your code brilliantly. But ask one "what did the last 500 error look like?" or "what's the schema of the orders table?" and it… guesses. It doesn't know what's running. It can read the migration file, but not the database. It can find the route, but not the request that just failed against it.</p><p>Grove has quietly been collecting exactly that missing context — every request it proxies, every webhook it catches, every site's <code>.env</code> and database. So for 1.0, we did the obvious thing: we handed it to your AI.</p><p>Meet <code>grove mcp</code>.</p><h2>Why: the context was already here</h2><p>Grove sits in front of every <code>*.test</code> site. It knows your PHP and Node versions, your services, your request timeline, your captured webhooks, your logs — and it can read each project's database straight from its <code>.env</code>. That's a remarkably complete picture of your local world, and until now only you could see it in the app.</p><p>The Model Context Protocol is the standard way to expose that kind of thing to AI clients like Claude and Cursor. Grove speaks it now. No per-project setup, no wiring — because Grove already had the answers, it just needed to offer them.</p><p>And to be clear about the boundaries: it's read-only and local-only. The server refuses anything that isn't a <code>SELECT</code>, never touches your files, and makes no outbound calls. Your AI gets a window, not a lever.</p><h2>How: one command, one config block</h2><p>Start it (though you rarely run it by hand — your client launches it):</p><pre><code class="language-bash">grove mcp
</code></pre><p>Then point your AI client at it. Claude Desktop — <code>~/Library/Application Support/Claude/claude_desktop_config.json</code>:</p><pre><code class="language-json">{
  "mcpServers": {
    "grove": { "command": "grove", "args": ["mcp"] }
  }
}
</code></pre><p>Cursor — the same block in <code>.cursor/mcp.json</code>. Restart the client, and Grove shows up as a set of tools.</p><h2>What your assistant can now do</h2><p>Seven read-only tools, each answering a question you'd otherwise dig for by hand:</p><p>Tool It answers <code>grove_sites</code> Every site Grove serves (host, driver, PHP/Node, HTTPS, path). <code>grove_requests</code> Recent requests — method, path, status, duration. <code>grove_request</code> Full headers + body of one captured request. <code>grove_webhooks</code> Recently captured inbound webhooks. <code>grove_logs</code> Log sources, and recent Laravel / service entries. <code>grove_db_schema</code> Tables and columns for a site's database. <code>grove_db_query</code> Run a read-only <code>SELECT</code> and return rows.</p><h2>Examples: stop pasting, start asking</h2><p>Once it's connected, the conversation changes. Instead of copying logs into a chat window, you ask:</p><blockquote><p>"The /checkout route on shop keeps 500-ing. What's going on?"</p></blockquote><p>Your assistant calls <code>grove_requests</code> to find the failing request, <code>grove_request</code> to read its exact body, and <code>grove_logs</code> to pull the matching Laravel stack trace — then tells you the fix. It saw what actually happened, not a summary you typed from memory.</p><blockquote><p>"Show me the orders schema and how many shipped today."</p></blockquote><p>It calls <code>grove_db_schema</code> for the columns, then <code>grove_db_query</code>:</p><pre><code class="language-sql">select count(*) from orders where status = 'shipped' and created_at &gt;= date('now')
</code></pre><p>…and answers with a number, from your real local data.</p><blockquote><p>"Stripe just sent a webhook — did my handler accept it?"</p></blockquote><p><code>grove_webhooks</code> shows the delivery; if you've been using the webhook hub from 0.13, it's all right there. Your assistant reads the payload and the 200, and confirms.</p><p>No copy-paste. No "here's my schema, trust me." The AI reads the same live state you'd click through in the app.</p><h2>And: this is 1.0</h2><p>The MCP server is the headline, but 1.0 is really about a promise kept. Everything a local dev environment should do — and Grove does all of it with zero external dependencies, no Homebrew, no Docker required, no dnsmasq:</p><ul><li><p><code>*.test</code> sites with trusted local HTTPS, automatically</p></li><li><p>bundled, multi-version PHP and Node, per site</p></li><li><p>bundled MySQL, PostgreSQL, Redis — and a mail catcher</p></li><li><p>native public tunnels (<code>grove share</code>)</p></li><li><p>a live request timeline with replay and copy-as-Pest-test</p></li><li><p>a local webhook hub you can re-deliver from</p></li><li><p>a built-in database client</p></li><li><p>reproducible environment bundles (<code>grove bundle</code>)</p></li><li><p>and for teams, end-to-end encrypted secret sync</p></li></ul><p>The entire core is free and open source, forever — we're pointed about that, because a few of these things are locked behind paywalls elsewhere. Grove Pro adds a team/power layer on top (secret sync, database editing) without ever gating what makes local dev work.</p><h2>Try it</h2><p>If you're already running Grove, it updates itself — you're on 1.0. Add the config block above to Claude or Cursor, then ask your assistant something you'd normally have to go look up:</p><pre><code class="language-text">"What did the last failed request to myapp look like, and what's the users table schema?"
</code></pre><p>Watch it just… answer, from your actual machine. That's the whole idea. 🌱🌳</p><p>Grove is free and open source (MIT). <code>grove mcp</code> is read-only and local-only. Get it at <a target="_blank" rel="noopener noreferrer nofollow" href="https://elyracode.com/grove">elyracode.com/grove</a>.</p>