Security controls
The risks with agent tools are specific: a server that changes a tool after you approved it, instructions hidden in a tool’s description, and content from one tool (a web page, an email, a ticket) that talks the agent into misusing another. The gateway answers each with a control that works on every call and needs no change in the agent. Its own controls are deterministic: no model decides whether a call goes ahead (an AI-judge guardrail you attach is the one exception you choose).
| Control | Stops | Default |
|---|---|---|
| Approved definitions | A tool changed upstream after approval (a rug pull), unknown tools. | On, always |
| Definition scan | Instructions hidden in a tool’s name, description or arguments (tool poisoning). | On: flagged definitions are quarantined |
| Tool allowlist | A key using tools it was not meant to. | Off: a key may call every enabled tool |
| Guardrails | Secrets in arguments, injected instructions or personal data in results, anything a guardrail checks. | Built-in scan records findings; attached guardrails act |
| Untrusted content | A Privileged tool called right after the caller read content someone else wrote. | On for tools marked Privileged |
| Approvals | Risky calls going ahead without a person. | Tools marked Needs approval |
| Server requests | A server asking for LLM calls on your account, for credentials, or for the agent’s files. | Sampling off, roots off, elicitation on with credential forms refused |
| Rate limits | A runaway agent. | The plan’s per-workspace limit; per key if set |
At sync the gateway records the exact definition of every capability, description included: rewriting a description is all a poisoning attack needs. A call is allowed only when the tool is known, switched on for the connector and the endpoint, and unchanged since it was approved. Unknown means refused. Tool lists go further: a tool is shown to an agent only when the definition the server is serving at that moment is the approved one, so a description rewritten between syncs never reaches the model.
Every new or changed definition is scanned at sync: names, titles, descriptions, annotations and every argument description, value list and default. It looks for the published poisoning patterns: hidden tags such as <IMPORTANT>, instructions to read sensitive files, to send data to an address, to keep something from the user, or to change how other tools behave. A flagged definition is quarantined: hidden from lists and refused, with the findings shown on the Capabilities tab, until an admin releases that exact definition. A later change is scanned again.
An MCP key can be limited to some tools: <endpoint>/<tool>, or <endpoint>/* for all of one endpoint’s tools. It can only narrow what the endpoint allows. Tools outside it are hidden from the key and refused, including through discover and run.
Two kinds run on tool calls, prompt requests and resource reads: on the arguments before anything is sent, and on the result before the agent sees it. Each text field is checked on its own, so a redaction keeps the rest intact.
- The built-in scan, with nothing to set up: arguments for secrets; results for injected instructions and secrets; resources also for personal data. It records what it finds (the call’s drawer in Logs shows it) and does not block.
- Your guardrails, attached on a connector (every endpoint of it) and on an endpoint (added to the connector’s). They act as configured: BLOCK, REDACT or MONITOR. One that cannot run fails the call closed. A blocked argument means the tool is never called; a blocked result is withheld; a redacted one is what the agent gets and what is stored. See Guardrails.
Guardrails bound to a virtual key apply to LLM requests only, not to tool calls.
The gateway cannot see an agent’s context, but it knows what it handed the agent. Every result is treated as untrusted (someone outside could have written it), unless its capability is marked Trusted output. After receiving untrusted content, the caller (the MCP key, or the person) counts as having it in context for 30 minutes, across the whole organization: an agent reads with one tool and writes with another.
During that time a tool marked Privileged is refused, naming the call that brought the content in, unless a person approves the call. If the gateway cannot tell whether the caller has received untrusted content, it refuses. Results carry a hint saying until when the caller counts as having untrusted content (see hints).
A tool marked Needs approval is held on every call, and a Privileged tool is held when the caller has untrusted content. A held call is refused with a link to the Approvals page, where it shows the caller, the tool, why it was held and its exact arguments.
- A person approves or rejects it within 24 hours. Only a signed-in person decides, never a key: a workspace admin, or the person whose own call it was.
- The agent makes the same call again (same caller, endpoint, tool and arguments) within 15 minutes of the approval. It goes ahead once.
- Nothing runs from the Approvals page itself, and a retry while the request is still waiting points at the same request rather than queuing another.
While answering a call, an MCP server can ask the client for things. Each endpoint decides on its Server requests tab, and every request is logged as its own row under the call.
| Request | What the gateway does |
|---|---|
| Sampling (an LLM completion) | Off by default. When on, the gateway runs it itself on a virtual key and model chosen for the endpoint, so the key’s budget, limits and guardrails apply, plus the connector’s and endpoint’s. The server’s model preferences are ignored, a request offering the model tools is refused, the answer is capped (1,024 tokens unless set), and an optional monthly budget per endpoint stops it. These completions appear in Logs marked as sampling for the endpoint. |
| Elicitation (a question for the person) | On by default, relayed to clients that support it (2026-07-28 protocol) after the built-in scan and guardrails. A form asking for a password, API key, token, card number or similar is always refused: a server collects credentials through its own sign-in. Sending the person to a web page is off unless you allow it, and https only. |
| Roots (the agent’s folders) | Off by default. The gateway answers itself with a list you set; nothing about the agent’s machine is shared. |
| Nesting depth | How many rounds of server requests one call may take, 3 by default (1 to 10). |
- Who may use an endpoint. On its User access tab: allow or deny by default, and per person. Applies to people signing in, not to keys. A denial is recorded like any refusal.
- Connections. The endpoint’s Connections tab lists the MCP clients people approved, and revokes them. People see and revoke their own on their profile.
- Rate limits. Each key can have calls per minute and per day, and the plan sets a limit per workspace. These counters are separate from LLM traffic. Over a limit, the answer is HTTP 429 with Retry-After.
Every refusal names its control, in the tool result’s _meta["ai.vectoraxis/gateway"].control, in the JSON-RPC error’s data.control, or in egress mode’s X-VectorAxis-Gateway header, and in Logs.
| Control | Meaning |
|---|---|
| UNKNOWN_CAPABILITY | The connector has no such tool, prompt or resource. |
| DISABLED, DISABLED_ON_SERVER | Switched off on the connector, or on this endpoint. |
| REMOVED | The server stopped offering it. |
| DRIFT | Its definition changed since it was approved. |
| QUARANTINED | The definition scan flagged it and nobody released it. |
| NOT_IN_KEY_ALLOWLIST | The key is limited to other tools. |
| GUARDRAIL | A guardrail blocked the arguments (nothing was sent) or the result (withheld). |
| TAINTED | A Privileged tool, while the caller has untrusted content. Approve the call, then retry it. |
| APPROVAL_REQUIRED | A Needs approval tool. Approve the call, then retry it. |
| CONNECTION_REQUIRED | The tool needs an account at the provider that this caller has not connected; the message links to connect. |
| USER_ACCESS_DENIED, NOT_A_WORKSPACE_MEMBER | The person may not use this endpoint. |
| RATE_LIMITED | Over the key’s or the workspace’s limit (HTTP 429, Retry-After). |
| SAMPLING_REFUSED, ELICITATION_REFUSED, NESTING_DEPTH, SERVER_REQUEST_REFUSED | A server request the endpoint does not allow. |
| METHOD_NOT_ALLOWED | An MCP method the gateway does not pass on. |