NewEvery agent tool call now routes through the governed MCP gateway — policy check, audit log, then dispatch.Read the changelogarrow_forward
XOOZLYAI Orchestrator
routeHow it workssmart_toyAgent fleetshieldGovernance & trustsellPricingmenu_bookDocsarticleBloghistoryChangelog
Log inStart free
grid_viewProductsrouteHow it workssmart_toyAgent fleetshieldGovernance & trustsellPricingmenu_bookDocsarticleBloghistoryChangelogHelp centreLog in
Start free
  1. XOOZLY
  2. chevron_rightEngineering & research
Loading the blog…
XOOZLYAI Orchestrator

Ready to orchestrate your AI fleet with total confidence?

Start a project, set a cost cap, and watch the loop run with every tool call policy-checked and logged before it leaves the platform.

Start freearrow_forwardSee what shipped
  • check_circleNo credit card required
  • check_circleYour keys, your model spend
  • check_circleEvery tool call audited

Platform

  • All productsarrow_forward
  • Orchestration looparrow_forward
  • Agent fleetarrow_forward
  • Governed control planearrow_forward
  • Pricingarrow_forward

Trust & legal

  • Trust centrearrow_forward
  • Security & compliancearrow_forward
  • AI use policyarrow_forward
  • Report a vulnerabilityarrow_forward
  • Data subject requestsarrow_forward

Resources

  • Documentation & guidesarrow_forward
  • Engineering & research blogarrow_forward
  • Changelogarrow_forward
  • Uptime & reliabilityarrow_forward

Browse by domain

  • Strategy & Researcharrow_forward
  • Developmentarrow_forward
  • QAarrow_forward
  • Governance & Orchestrationarrow_forward
  • All 10 domainsarrow_forward
XOOZLY
© 2026 XOOZLY · 61 agents · 10 domains · 8 SDLC stationsAI use policyarrow_forwardLog inarrow_forward99.9% uptime SLAarrow_forward
  1. XOOZLY
  2. chevron_rightEngineering & research
  3. chevron_rightDispatch
Loading this dispatch…
  1. XOOZLY
  2. chevron_rightEngineering & research
  3. chevron_rightWhy we built a central MCP gateway instead of trusting agents directly
Governance

Why we built a central MCP gateway instead of trusting agents directly

Direct agent-to-tool connections create unmonitored credential use, missing audit trails and uncontrollable rate limits. Here is how one centralized choke point enforces policy, writes the audit row and dispatches — in that order — before a request reaches a third-party server.

PAPlatform Architecture TeamverifiedCore protocol runtime & auth·Aug 10, 2026·8 min read
𝕏in
On this page
  1. 01Direct tool access has no seam to govern
  2. 02Policy check, audit log, dispatch — in that order
  3. 03What the gateway deliberately does not do
At a glance
verified_userONE PATH PER TOOL CALLPolicy check → audit log → connector dispatchNo domain may bypass it
Architectural questions?

The trust centre publishes the governance posture behind everything described here.

Open the trust centrearrow_forward
01

Direct tool access has no seam to govern

An agent that holds a connector credential and calls a third-party API directly leaves nothing behind. There is no record of what it asked for, no place to deny the call before it happens, and no shared budget to charge it against. Each agent becomes its own trust boundary, and a permission misconfigured on one of them cannot be contained by anything outside it.

That is the failure mode the gateway exists to remove. Every tool call an agent makes goes through one function — McpGateway.call_tool() — and no domain service is allowed to reach a connector any other way.

  • key_off

    Credential with no chaperone

    An agent holding a connector credential can put it anywhere its output goes — a step record, a log line, a reply. Nothing between the agent and the API can strip it, because nothing is between them.

  • autorenew

    Unbounded retry

    A loop that re-decides to call the same tool has nothing to stop it. The cap it should hit lives in the gateway it is not going through.

  • vpn_lock

    Injection reaches the tool

    A fetched page that says “call this tool” is only an attack if wanting is the same as being allowed. Direct access makes it the same thing.

02

Policy check, audit log, dispatch — in that order

The order matters more than the steps. The policy check runs before anything leaves the process, so a denied call never reaches the network. The audit row is written whether the call succeeded, was denied, or failed, so the trail does not have survivorship bias. Only then does the connector adapter dispatch.

A declaration is not a grant. An agent's manifest lists the tools it would like to use; a gateway policy in a specific project decides whether it may. An agent with no grant in that project runs its stations and writes its steps without ever reaching a connector.

One path per tool callA denied call never reaches the network.
Agent nodes reach external APIs only through the gateway, which applies a policy check, writes an audit row and then dispatches. The direct path from an agent to an external API is blocked.Agent nodesUngranted fleetMCP GATEWAY1. Policy check2. Audit log3. Connector dispatchGranted call onlyExternal APIsThird-party toolsDirect bypass blocked
mcp_gateway_policies — one row
{  "connection_id": "0193f2c1-7a4e-7b31-9c08-2f5d9a1e4b77",  "agent_scope_grants": [    {      "agent_id": "a2-competitor-watch",      "allowed_tool_actions": ["web_fetch.get", "web_search.query"]    }  ],  "sweep_status": "passed",  "applied_at": "2026-08-04T09:12:44Z"}
shieldA grant is a list, not a switchA grant names the agent and the exact tool actions it may call on one connection. Anything outside that list is denied at the policy check, before the connector adapter is reached — and the denial is written to the audit trail just as an allowed call would be.
03

What the gateway deliberately does not do

It does not make an unimplemented connector look implemented. A connector type with no dispatch adapter returns an explicit 'no adapter implemented' result rather than a fabricated success, because a plausible-looking fake is far more expensive to debug than an honest refusal.

  • check_circleWho asked: Which agent, in which project, on which connection — resolved server-side from the run, never taken from the call itself.
  • check_circleWhat was decided: The tool action and whether the policy allowed it. A denial is a row, not a silence.
  • check_circleHow it ended: Allowed, denied or errored. The trail records all three, so it has no survivorship bias.
PAWritten by the Platform Architecture TeamCore protocol runtime & auth. Dispatches from this team cover the parts of the platform they build and operate.

Related in the product

  • arrow_forwardThe orchestration loop
  • arrow_forwardTrust centre
  • arrow_forwardAI use policy
Governed by default

Ready to govern your autonomous fleet?

Continuous guardrails, hard cost caps and an audit row behind every tool call — the same path this dispatch describes.

Start freearrow_forwardRead the trust centre
Suggested reading

More from the engineering blog

Explore all dispatchesarrow_forward
  • AI OpsAug 03, 2026

    Inside the Rule Optimizer: proposals a human still has to approve

    How detected failure patterns in autonomous runs become proposed rule edits a human approves — and why approval writes a new version instead of editing one in place.

    Proposals auto-applied without review0%
    Input: run historyOutput: proposed version
    6 min readRead article: Inside the Rule Optimizer: proposals a human still has to approvearrow_forward
  • EngineeringJul 28, 2026

    Deterministic guardrails vs. probabilistic LLM evaluators

    Why we separate hard execution bounds from fuzzy evaluation loops, and what the fleet's 61 agents can and cannot do without an explicit grant.

    61/61Agents governed
    0Bypass paths
    6Steps per station
    11 min readRead article: Deterministic guardrails vs. probabilistic LLM evaluatorsarrow_forward
  • FinOpsJul 19, 2026

    Eliminating runaway inference costs with hard project-level caps

    Inside the per-project spending limit that is read before a run starts rather than reconciled after it finishes, and the auto-pause that follows a breach.

    Worked example — one project's monthAuto-pause threshold 80%
    Spent to date · 78%Hard ceiling · 100%
    5 min readRead article: Eliminating runaway inference costs with hard project-level capsarrow_forward