Published Oct 6, 202614 min read
Tool Access Gets You a Demo. Control Gets Agents to Production.
What makes AI agents succeed is not access to external tools, it is control over them. The four failure modes of raw tool calling, the eight controls that fix them, and the Vinkius layer that ships each one, with its latency, its cost and its defaults.

By Renato Marinho
Founder · Vinkius
Every agent demo I have watched ends the same way. The assistant reads an email, finds the order in it, issues a refund, and everybody claps. Then somebody asks the question that kills the demo: what happens when it refunds the wrong customer?
The industry has spent two years answering that question with a better model. More reasoning, longer context, sharper system prompts. It is the wrong lever. The failure is not in the reasoning. It is in the connection between the reasoning and the world, and that connection has no intelligence you can fix by prompting it.
I founded Vinkius, and most of my days are spent with engineering teams trying to put agents into production. The teams that ship are never the ones with the cleverest prompts. They are the ones that solved a different problem first, and solved it before they wrote a single prompt: not how their agents get access to tools, but how they stay in control of them.
Access gets you a demo. Control gets you to production.
Access is a solved problem
This part is done. The Model Context Protocol standardized how a model discovers and calls a tool, and the connector economy filled in the catalog. At Vinkius alone we run 9,268 managed Connectors exposing 63,133 capabilities, reachable from ChatGPT, Claude, Gemini, Cursor and 16 more AI clients, one URL per Connector. If you want your agent to read a Gmail thread, post to Slack, charge a Stripe card or query a Supabase table, you can wire it up in an afternoon. No code, no SDK, no wrapper.
This is why access is no longer the moat. When any agent can call any API in five minutes, being able to call APIs gives you no advantage at all. The advantage moved somewhere else.
Control is the unsolved one
Give an agent a raw tool and it can act. Ask it four questions about that action, and it cannot answer a single one.
Whose credential is this? A raw tool call needs a secret, and the fastest way to get one is to paste it into the model provider's configuration. From that moment your Slack token lives inside a context window, under a retention policy you do not control, in logs you cannot read.
Was this action allowed, for this agent, right now? A token with broad scopes answers a question the agent never asked. Nothing along the call path compares the action against a policy, and nothing narrows the blast radius before the request leaves the door.
What happened, and who owns the failure? A raw setup gives you a red log line and no idea who owns it. Did the caller send a bad request? Did the provider return a 503? Did your own policy layer block the call? Every incident turns into an archaeology dig.
What did it cost, and who stops it? Agents loop. They retry a flaky call, they re-read the same large payload, they page through a thousand records into a context window, and nothing along the way counts the tokens, caps the spend, or halts the loop.
Four questions, zero answers. Every production incident with agents I have seen started in that gap, not at the model and not at the API, but in the layer between them where nobody built anything.
The four failure modes, in engineering terms
Each missing answer has a signature failure, and they are worth naming because these are the ones that wake you up at 2am.
Credential exposure. The secret-in-context pattern is the most common failure, and the most unnecessary one. You do not fix it with better prompt hygiene. You fix it by never putting plaintext anywhere in the model's path: keep it in an encrypted vault, authenticate with a signature instead of a shared string, and hold credentials outside the server code so they cannot be read while it runs. On Vinkius, credentials are AES-256 encrypted at rest and authenticated with HMAC-SHA256. The plaintext is never stored, and it never reaches the model.
Unbounded blast radius. A tool that can read an invoice and a tool that can refund a customer should not carry the same weight in an agent's hand. Control means the call path judges the action, not just the credential: per-action authorization, destructive operations gated behind approval, sensitive fields masked before the response comes back. On our platform, data loss prevention patterns like *.email, *.credit_card, *.ssn, *.iban and *.api_key are matched in RAM and redacted before the model sees the payload. That is what makes the layer defensible under GDPR instead of merely convenient.
Zero attribution. When a call fails, the only useful question is which party caused it. Without instrumentation you cannot answer it, so you guess, and you guess wrong. The fix is decomposing every request as it passes through, splitting upstream API latency from governance overhead on every call, and assigning each error to the caller, the provider, or the governance layer. There is an integrity test hiding in that design: our reliability KPI excludes the errors we cause ourselves, because a platform that counts its own blocks as upstream failures will quietly report an uptime it does not have.
Unbounded spend. This one fails silently and only surfaces when the invoice arrives. An agent that retries a flaky API 400 times, or pulls a 100,000-item array into its context window, spends money in a way no human reviewer would ever approve. The controls are blunt and they work: truncate array responses after a configured number of items, compress tool descriptions so the schema costs fewer tokens, and put a circuit breaker in front of the budget. On Vinkius, 5,000 requests inside a 5-minute window trips a 15-minute cooldown, automatically, before the money is gone.
The anatomy of a governed tool call
The mechanism is simpler than the failure list makes it sound. An agent sends intent, not integration logic: a capability, the input it needs, the identity authorizing it. Everything else belongs in the layer.
| Step | What happens | What it prevents |
|---|---|---|
| Authenticate | Bind the request to the correct user account | Shared credentials, stolen tokens, identity confusion between agents |
| Authorize | Enforce permissions for the specific requested action | Over-scoped tokens, unauthorized destructive operations |
| Resolve | Map the capability to the correct system operation | Hallucinated tool names, wrong-endpoint calls |
| Execute | Run, retry and record the operation | Silent failures, unattributed incidents, lost evidence |
The result that comes back is structured: status, normalized output, and a recorded trace, so the agent's next decision is made against a known state instead of an assumption.
None of this is free, and latency is the first thing any platform team asks about, so here it is. Governance adds time. On our platform the overhead is in the tens of milliseconds: a representative GitHub call decomposes into 96ms of upstream API time and 38ms of governance overhead, and a Notion search into 74ms and 22ms. Next to a model inference in the same round trip, that is noise. We measure it per request, publish it per request, and keep it separate from the provider's own latency, because that is the only honest way to ship it.
What control actually means: eight controls
Teams that ask for a checklist get this one. These are the controls that separate a production agent from a demo, and the default each one should ship with.
| Control | What it does | The default it needs |
|---|---|---|
| Credential isolation | Secrets never reach the model or the server code | Encrypted vault, signature auth, no plaintext stored |
| On-path authorization | Every action is checked in flight, not after the fact | Per-action, per-agent, evaluated before the call leaves |
| Data redaction | Sensitive fields are masked in RAM before return | PII and financial patterns on by default, globally |
| Tamper-evident audit | A chain where editing any record breaks the one after it | SHA-256 linked, Ed25519 signed, retained |
| Latency attribution | Upstream time separated from governance time | Per request, not averaged away |
| Failure ownership | Every error assigned to caller, provider or platform | Platform-caused errors excluded from reliability KPIs |
| Spend containment | Hard ceilings that halt traffic, not alerts that email you | Circuit breaker with cooldown, response truncation |
| Emergency halt | One switch that stops every agent, synchronously | All connectors off, all tokens revoked, all sessions ended |
The longer version of this argument is in The Control Plane of the Agent Era: eight rules, from on-path enforcement to a human hand on the wheel, and where each one lands in the stack.
Why control is cheaper than its absence
People argue about the economics more than the numbers warrant, so here are the numbers.
A governed connector call at marginal volume is $0.0005, and overage beyond a plan allowance is $5 per 10,000 requests; your connections stay active past the limit and no plan migration is required. Set against that, one uncontrolled loop is not a rounding error. A single agent stuck in a retry cycle against a paid API can burn a month of governance spend in an afternoon, before you even cost the incident review.
The savings run the other way and they are measurable, not aspirational. Truncating oversized array responses and compressing tool descriptions removes tokens before they get billed. In a representative 30-day window on our governance dashboard, 4,230 requests and 2,840,000 tokens consumed at a configured $3.00 per million, those two guards saved 620,000 tokens. That is $1.86 against $8.52 of spend, a 21.8% FinOps return. None of it required a smarter model. It required a layer that counts.
How the layer is built
A control plane that is not itself hardened is just a new attack surface, so the engineering details matter as much as the policy list.
Every Connector runs inside its own isolated V8 environment with no access to your files, your system, or other servers, under 34+ security rules enforced on each request: memory and CPU limits, SSRF protection that blocks requests to private networks, malicious compressed file detection, credential isolation. Idle servers resume in 3 to 5 milliseconds with their state preserved, which is what makes per-tenant isolation affordable instead of a luxury. The full runtime story, including how we eliminated cold starts for untrusted code, is in How Vinkius Runs MCP Servers in V8 Isolates.
Every action lands in an audit trail where each record is chained to the previous one with SHA-256 and signed with Ed25519. Change an earlier record and the chain breaks in a visible way; the history is verifiable instead of merely stored. Security keys rotate on a 24-hour cycle with no manual intervention, and security events stream to Splunk, Datadog, or a custom webhook, batched, signed, and delivered exactly-once with automatic retries. The observability side of this, correlating MCP tool calls into a distributed trace, is in MCP Fusion 5.1.0.
Then there is the switch that ends an incident. A Global Emergency Halt, gated behind a typed confirmation, deactivates every active Connector, revokes every token, and terminates every running session in one synchronous action. When something is going wrong you do not file a ticket and you do not rotate keys one by one. You stop everything first, then investigate. Connectors can be restored afterwards and revoked tokens have to be issued again. Protection you can undo, damage you can prevent.
Where the architecture puts it
The shape of the thing answers the original question. A raw integration puts the credential in the agent and hopes for the best. A governed layer sits on the path and decides.
| Direct tool access | Governed capability layer | |
|---|---|---|
| Credentials | In the agent config, in context, in provider logs | In an encrypted vault, never exposed |
| Authorization | Whatever the token's scopes allow | Per-action, evaluated in flight |
| Blast radius | The full scope of the token | Narrowed to the requested action |
| Failure diagnosis | Red log line, guess the cause | Attributed to caller, upstream or platform |
| Spend control | None, until the invoice | Circuit breaker, truncation, per-call ledger |
| Audit trail | Provider logs you cannot verify | Signed, chained, tamper-evident |
| Stopping an incident | Revoke keys one at a time | One switch, everything, instantly |
| Switching AI clients | Redo every integration | Same connection, same link, any client |
That last row is the one people miss. Control and portability are not in tension; they are the same design. Once the credentials, the policies, and the audit trail live in the layer instead of in the agent, your connections stop being hostage to whichever assistant is trending this quarter. You paste the same link into the next client and your apps, your permissions, and your history follow you. The deeper version of that argument, including how an agent's perception should be shaped at the boundary instead of being handed raw JSON, is in MVA, the Model View Agent Pattern.
Frequently asked questions
Doesn't governance just slow agents down? It adds tens of milliseconds per call, measured and reported per request so you can see it. Next to a model round trip that is noise, and the alternative is not faster. The alternative is unattributed, unbounded, and unaudited, which is a latency problem you discover during an outage.
If I use a managed layer, do I lose control of my agents? The opposite. The layer is where the control lives. You set the policies, the spend ceilings, and the redaction patterns, you see every execution, and you hold the switch that stops everything. Handing an agent a raw token is what gives control away, because after that the only constraint is the token's scope and you cannot narrow it.
Is this only for MCP? No. Anything that puts a model on one end of a tool call benefits from a governed path. MCP is where the boundary is most visible, because it standardizes tool discovery, and it is the protocol our Connectors speak to every supported client.
What does it cost? Plans start at $9 per month for 5,000 calls with the full managed catalog, and scale by request volume and control set. At marginal volume a connector call is $0.0005, with overage at $5 per 10,000 requests and connections staying active past your allowance.
What happens when my agent does something wrong? You stop it with one switch: every Connector deactivated, every token revoked, every session terminated, at the same time. Everything leading up to that moment is in the signed audit trail, so you can see which agent called which tool with which identity, and fix it in minutes instead of reconstructing it from provider logs.
Does this help with EU AI Act compliance? The controls map onto what the Act expects of high-risk systems: transparency through recorded tool calls, record-keeping through the tamper-evident trail, human oversight through approval gates and the emergency halt, and containment through spend and rate limits. Deployment approval implements the four-eyes principle explicitly, and the full Q&A on enterprise requirements is in Twelve Hard Questions About Vinkius.
Why I built it
I have shipped a few platform shifts, and every one of them had the same trigger: the thing that used to be hard stopped being hard, and everybody kept solving it anyway. Getting an agent to call an API is an afternoon's work now. It is not the problem.
The problem is the question that ends every demo. Once an agent can act on the world, the only thing between a clapping room and a page at 2am is the layer that decides whether the action should happen. Nobody was ever promoted for building a smarter agent that refunded the wrong customer.
So we built the layer. Access for the agent, control for you, and a signed record of the difference.
