Everything your agent needs, in one place.

Every connector points at accounts you already run โ€” delegated OAuth, scoped tools, and one endpoint for MCP or plain HTTP.

In action

One question. Everything it touched, and everything it couldn't.

Tools available3
google_ads.spendSpend and ROAS, last 7 days
hubspot.dealsDeals that changed stage
gong.transcriptWhat was said on the calls
Not available
stripe.balanceNot connected by this org absent
Agentorg acme

"What did we spend on ads last week, and which deals moved?"

Spend, last 7 days$47,000
Deals advanced14
Calls naming the top creative4 of 9

Spend is up, and the pipeline moved with it โ€” but the lift is one creative.

3 calls · 3 log rows0 bytes stored
Your connectionsacme
GoogleOAuth 2.0 yours
HubSpotOAuth 2.0 yours
Refused this run
gong.calls · org netflixAnother tenant's account denied

Connect once. Then watch what it does.

01
Connect an account

Your own login, your own permissions, revocable in a click.

02
Take one key

It reaches only the accounts you connected.

03
See every call

What was asked, of which account. Never the data itself.

Enforced by the database, not by our code remembering to check.

Features

What you don't have to build.

Managed auth

OAuth, refresh and revocation, handled. Granted by you, revocable by you.

Tools scoped to your connections

An agent sees tools for the accounts you connected. Nothing else is listed.

listed google_ads.spend connected listed hubspot.deals connected absent stripe.balance not connected

One endpoint, any client

MCP for Claude and friends, plain HTTP for the rest. No SDK to adopt.

claude mcp add singlebrain \
  --url $GW/mcp

curl $GW/v1/hubspot/deals \
  -H "Authorization: Bearer $KEY"

Nothing crosses between clients

Each client is its own tenant. Postgres refuses the query itself, so a bug returns nothing rather than someone else's data.

acme
own accounts
denied
netflix
own accounts
SecurityAES-256-GCM per org and service. SOC 2 in progress.
StabilityReach follows the connections, never a drifting list.
ReliabilityPer-org ceilings counted in Postgres, not in memory.
Questions

The ones that actually come up.

What exactly can the key reach?

Only the accounts its org connected, in the scopes that org granted, read-only. The reach is a consequence of the connections, so there is no separate permission list to drift out of sync.

Do you store our data?

We store the encrypted credential and a shape-only audit row per call โ€” who asked, which service, which kind of request. Not the payload that came back, which is why the log is safe to forward to a client.

Is isolation a convention or a boundary?

A boundary. Row-level security in Postgres, with the application connecting as a role that cannot bypass it and has no schema rights. The tests run against a real database as both roles, because a mocked fence proves nothing.

How does this relate to a Single Brain deployment?

Single Grain sells managed revenue agents; the Gateway is how one reaches your accounts. Shared and multi-tenant here, with the fence doing the work โ€” or a dedicated deployment on infrastructure nobody else shares, for agents that act rather than only read. Same operating standard either way.

Point your agent at the real accounts.

Connect an account, take a key, and point your agent at it. The activity log shows you everything it did.

gateway.singlebrain.com