PLATFORM / For Developers

One gateway. Every tool.

You connect to us. We connect to your customers’ tools — and secure the access.

Try nowStart in three steps ↓Read the docs
01 / IDENTITY02 / POLICY03 / AUDIT
QUICKSTART

Start in three steps.

01

Register your agents

Name the app your agents run under and pick the scopes it may ever ask for — one form, one-time secret, no provider paperwork.

  • Name it — an app id and a display name.
  • Pick scopes — per tool, from the catalogue.
  • Activate — one-time secret, then it is live.
afctl
afctl applications register --app-id my-agent
02

Connect each customer

Your customer approves the provider’s consent screen on a page we host. No Fabriq account, no sign-up. The only user identifier you send is your own user ID.

  • Customers authorize their own tools.
  • Keep your own external user IDs.
  • Never store provider tokens — Fabriq vaults them.
oauth/initiate
POST {AF_API_URL}/api/v1/apps/{AF_APP_ID}
     /external-users/{our_user_id}/oauth/{provider}/initiate
headers: X-App-Id, X-App-Secret
body: {"connection_id": "<our_user_id>-<provider>",
       "scopes": [...]}

# redirect the user to the returned oauth_url.
03

Mint a token, call tools

Mint a token for your own user ID, then call tools through the gateway. The Python SDK is the shipping client.

  • Server-side only — keep AF_APP_SECRET off the client.
  • Each request is constrained to that customer’s access.
  • Treat a 401 from the gateway as “mint a new token”.
token
POST {AF_API_URL}/api/v1/apps/{AF_APP_ID}
     /external-users/{our_user_id}/token

-> {"access_token": "...", "expires_in": 3600}
SELF-SERVE · START ON THE FREE PLAN
01 / THE CONTEXT

Your agent. Their tools.
Our access layer.

Two steps to ship. We handle the rest.

FABRIQ / REQUEST RECORDONE MCP TOOL CALL
REQUEST
tools/call · gmail_send_email

acting for customer_8842, as customer-agent

Gmail
FABRIQ
grant: gmail.send · chat:write

Tokens injected server-side · never in your process

Fabriq
RESPONSE
{"ok": true, "id": "msg_01H9"}

Logged with the user it acted for, the agent, the tool, and the verdict.

ALLOWED
02 / IN PRACTICE

Your agent. Their tools.

ONE TOKEN · ONE CUSTOMER’S ROOMIllustrative · customer-agent calling the gateway for one customer user
THE TOKEN YOU MINTEDexternal_user_id = "customer_8842"

One call to mint it, and it is constrained to that customer user for the rest of its life. You keep your own user IDs; the walls below are not something you have to build.

EXTERNAL USERcustomer_8842Northwind Trading · this token’s room
  • Gmail
  • Slack
  • Google Drive
  • Read the customer’s connected datagmail.list_messagesAllowed

    The token was minted for this external user, so the call reaches exactly what they connected — and nothing they did not.

  • Send an external messagegmail_send_emailHeld

    A named human approver has to say yes first. The draft waits; nothing leaves the room.

EXTERNAL USERcustomer_5120Harbour Foods · another customer’s room
  • HubSpot
  • Gmail
  • Read another customer’s accounthubspot.contacts.listBlocked

    Same agent, same gateway, different room. The token names one external user, so this call has no door — it fails at Fabriq, not inside your code.

EXTERNAL USERcustomer_7730Vela Labs · not in this request
  • Notion
  • GitHub
  • Nothing is offered here—No route

    The tool list is built for the user the token names. A room this token does not open is not a room the agent can see.

Illustrative customers · each call is recorded with the customer user it acted for and the agent that acted.

03 / WHAT CHANGES

Control, in the details.

01

Register your agent

Give the application an identity and define the scopes it may request.

02

Connect each customer

Customers authorize their own tools. Keep your own external user IDs.

03

Mint a user-scoped token

Each request carries the customer identity and is constrained to their access.

04

Call through one MCP gateway

Fabriq handles credentials, refresh, permissions, and a record of each call.

WHAT YOU STOP BUILDING
  • OAuth clientsOur provider apps and verification, not yours.
  • Consent screensWe broker the provider consent flow and its callback.
  • Token vaultAccess and refresh tokens encrypted at rest.
  • Refresh + retryExpiring tokens refresh before the call goes out.
  • Per-user scopingEvery call capped by what that customer granted.
  • Audit trailUser, agent, tool and verdict on each call.
  • Tool schemasOne schema per tool, served from the gateway.
  • RevocationDisconnect a customer and the stored grant is gone.
THREE LAYERS. ONE DECISION.

The boundary travels with the work.

Explore the context attached to every request.

What is this agent allowed to do?

customer-agent has a defined purpose and a bounded set of tools.

THE INTERFACES

A few lines. One connection.

agent.py
# pip install agentic-fabriq-sdk
from af_sdk import MCPClient

token = await af_client.get_mcp_token(
    external_user_id="customer_8842",
)

async with MCPClient(
    method="token",
    app_id=AF_APP_ID,
    app_secret=AF_APP_SECRET,
    af_token=token["access_token"],
    gateway_url=AF_GATEWAY_URL,
) as client:
    await client.call_tool(
        "gmail_send_email",
        {"to": "bob@example.com", "subject": "Hi"},
    )
Initialize af_client and your configuration first.
THE ENDPOINT

One MCP gateway

One endpoint. The token is injected into the call server-side, so your agent never handles or refreshes it.

POST/oauth/{provider}/initiateConnect a tool
GET/connectionsWhat they connected
POST/tokenMint a scoped token
POST/connections/{id}/disconnectRevoke
/api/v1/apps/{app_id}/external-users/{user}
MCP client setup
THE SDK

Python SDK

The Python SDK is the shipping client: mint a token for your own user ID, then list and call tools as that user.

shell
pip install agentic-fabriq-sdk
  • client.list_tools()
  • client.call_tool(name, arguments)
  • Env: AF_API_URL, AF_APP_ID, AF_APP_SECRET, AF_GATEWAY_URL
SDK documentation
THE CLI

afctl

Register the application your agents run under, and see the connections and the record from the terminal.

afctl
afctl applications register --app-id my-agent
  • One-time secret at registration — keep it server-side.
  • Scopes are picked per tool, from the catalogue.
CLI reference (afctl)
YOUR NEXT CHAPTER

Give your agents
room to move.

Try now
Integration HubInternal AgentsCoding Agents