# Integrate SQLGuard (Cursor / Claude / agents)

**Promise:** No production SQL mutation without Gateway authorization (PASS + verify).

**Sell:** AI agents need permission before they modify production data.

Canonical: `https://sqlguard.io` · Money truth: `GET /v1/money`

- **Companies (invoice primary):** Starter **$299/mo** → hello@sqlguard.io · [/gateway](https://sqlguard.io/gateway)
- **Agents (wealth Exact):** Pilot Challenge **$100** unlock · [/challenge](https://sqlguard.io/challenge) · amount `100000000`
- **Cursor paste:** [/CURSOR.md](https://sqlguard.io/CURSOR.md) · **Claude MCP:** [/CLAUDE.md](https://sqlguard.io/CLAUDE.md)

## Companies: paste this Action

Ship mutating SQL? Paste this Action — DENY returns `deny_id` → unlock Pilot Challenge **$100** or invoice **$299**:

- Action: `cabbageandtea/sqlguard/.github/actions/sqlguard-authorize-gate@master` · docs [/examples/sqlguard-authorize-gate.md](https://sqlguard.io/examples/sqlguard-authorize-gate.md) · **HOLD:** GitHub user flag 404s anonymous repo URLs until Support clears
- Ready YAML: [/examples/challenge-ci-paste.yml](https://sqlguard.io/examples/challenge-ci-paste.yml)
- Docs: [/GATEWAY.md](https://sqlguard.io/GATEWAY.md)

```yaml
- uses: cabbageandtea/sqlguard/.github/actions/sqlguard-authorize-gate@master
  with:
    sql: ${{ github.event.inputs.sql || 'DROP TABLE customers CASCADE' }}
    mode: decide
    allow_approval: "false"
```

On DENY: `POST /v1/challenge/unlock` amount `100000000` · or hello@sqlguard.io · Gateway $299/mo.

**Fail-closed hash bind:** `mode: pass` verifies Ed25519 PASS with `expected_sql_hash` (SHA-256 of gated SQL) — borrowed certs fail.

## Wealth path — Pilot Challenge ($100 Exact)

1. Free DENY: `POST /v1/challenge` or `POST /v1/gateway/decide` with mutating SQL
2. Unlock: `POST /v1/challenge/unlock` → Exact **$100** (amount `100000000`) on Base → seller `0xC8d524703f1751b565a220087D1d4c44a413C1D7`
3. Burn: `POST /v1/session/cert` with `schema_ddl` + `sql` + `agent_id`
4. `POST /v1/verify` → only if `ok:true` execute

MCP: `sqlguard_handshake` → `sqlguard_challenge` / `sqlguard_pilot` → `sqlguard_verify`  
Alt Exact: `POST /v1/gateway/pilot` · UI [/buy#pilot](https://sqlguard.io/buy#pilot)

## Claude Code plugin (2026 install path)

```text
/plugin marketplace add cabbageandtea/sqlguard
/plugin install sqlguard@sqlguard
```

Ships authorize skill + remote MCP `https://sqlguard.io/mcp`. Repo: `.claude-plugin/marketplace.json` · `plugins/sqlguard`.

## Claude Desktop / MCP

```json
{
  "mcpServers": {
    "sqlguard": {
      "url": "https://sqlguard.io/mcp"
    }
  }
}
```

Then: `sqlguard_handshake` → Challenge/Pilot → settle Exact → burn → `sqlguard_verify`.  
Prompt: MCP `authorize_sql_write`. Discovery: `GET /v1/gravity` · Probe is free and never authorizes; CDP may lag Fly.

Read-only DB MCP (Bytebase / AI2SQL / DataMCP) complements us — they govern reads; SQLGuard authorizes **writes**.

## Humans

Primary: https://sqlguard.io/gateway → Starter **$299/mo invoice**. Exact Pilot is the agent proof rail.

## Legacy Exact (OFF TABLE as primary)

Workday $2.50 · Session $0.25 · Instant $0.05 · prepaid micro — endpoints remain; do not lead GTM or handshake with them.

## Do not

- Treat lint / probe / GATE as authorization
- Skip `/v1/verify` or reuse a PASS without matching `sql_hash`
- Lead with Session / Instant / micro as the wealth path
- Count operator wallets as GTM — only `GET /v1/money` → `sales.gtm`
