ai agents (mcp)

point claude, cursor or any mcp client at a briven database — and know exactly what it can and cannot do.

the config to paste

Briven speaks the Model Context Protocol over plain HTTP. Create an API key on the api keys page, then add this to your client's MCP settings.

json

{
  "mcpServers": {
    "briven": {
      "type": "http",
      "url": "https://briven.tech/api/mcp",
      "headers": {
        "Authorization": "Bearer brk_your_key_here"
      }
    }
  }
}

That is the whole setup. There is nothing to install and no process to keep running — the server is the same one that serves the rest of briven.

use a read-only key first. A read-only key gets every reading tool and branching, and is refused every write. That is a good place to start with a database you care about — you can widen it later, and you cannot un-run a change.

what the agent gets

  • list_databasesread

    the databases the key can reach.

  • list_tablesread

    tables in a database. briven's own bookkeeping is hidden.

  • describe_tableread

    columns, types, nullability, defaults and the primary key.

  • queryread

    one read-only statement. select, with, explain, show — nothing else, whatever the key allows.

  • write_querywrite

    one statement that changes data or schema. refused outright on a read-only key.

  • list_branchesread

    the copies of a database, and when each was taken.

  • create_branchcreates a database

    a copy to experiment on. counts against your branch limit.

  • list_restore_pointsread

    the moments a database can be taken back to, and whether each is still reachable.

what it deliberately does not get

These are all real briven features. You can do every one of them from the dashboard, the management api or the cli. None of them is offered to a model, and the reasoning is the same each time: an assistant acts on an instruction that may have been ambiguous, at speed, and it reports success either way.

  • delete a databaseabsent

    the one irreversible act in the product. "clean up the old test databases" is a sentence a person understands with context a model does not have. there is no wording that makes this safe.

  • reveal a connection stringabsent

    would put a live credential into a model's context, and from there into a transcript. once it is in the transcript it is in the transcript.

  • restore a databaseabsent

    recoverable, which is exactly why it is tempting. an agent that restores "to be safe" costs you a database you did not ask for and disconnects the one you were using. reading restore points is offered; acting on them is not.

The rule we apply: a tool is offered only if the worst reading of an ambiguous instruction is still something you can undo in one click. Branching qualifies — the worst case is a spare database. Deleting does not.

the safe way to let it try things

Ask the assistant to branch first. A branch is a real, separate database taken at this moment — it can make whatever mess it likes there, and your original is untouched.

a safe experiment

you:   this migration might be wrong. try it somewhere safe first.
agent: create_branch { name: "before-price-migration" }
       write_query   { database: "before-price-migration", sql: "ALTER TABLE …" }
       query         { database: "before-price-migration", sql: "SELECT …" }
       "it worked on the copy. 412 rows changed. want me to describe the diff?"

branches are not free. A branch is a database and counts against your plan's branch limit, and taking one briefly disconnects the original's open connections. The agent cannot delete it afterwards — that is deliberate, and it means you decide what to keep.

you can see everything it did

Every tool call writes an audit row — the successes and the refusals — naming the tool and the key that ran it, never a person. An agent's work shows up in your history marked as a machine, so you can tell it apart from your own edits afterwards.