AnchorGate v0.1 is open source — self-host the full stack today. Star on GitHub →

AnchorGate

MCP security

The tool call is the attack surface.

An agent with MCP tools doesn’t need to be jailbroken to do damage — one stolen token or one permissive allowlist is enough. AnchorGate gates every tools/call deny-by-default: exact-string target matching, shell invocations rejected outright, and tokens that are useless outside their task and useless twice.

The mechanisms

Three mechanisms, no soft edges

Each one is a deliberate trade-off: stricter than convenient, because the failure mode it prevents is worse than the inconvenience.

Exact-string allowlists

Authorized targets match byte-for-byte. Wildcards are deliberately unsupported — wildcards are how DNS rebinding and token harvesting happen. If a target isn’t on the list exactly, the call doesn’t happen.

Shell invocations rejected outright

A tool call that reaches for a shell is refused before any policy evaluation — there is no allowlist entry that permits it. The riskiest capability class is simply off the table.

TBAC: single-use, task-bound tokens

Each token is bound to one task and burns on first use. A stolen token is useless outside its task and useless twice — replay is refused with the burn on the record.

MCP security

An MCP gateway that assumes the token will leak

One stolen token is all an MCP integration needs to become an exfiltration path. Long-lived credentials and wildcard allowlists don’t stop it — so AnchorGate’s MCP gateway is built as if the leak already happened.

  • Exact-string target allowlists — wildcards deliberately unsupported, because wildcards are how tokens get harvested.
  • Shell invocations rejected outright. The posture is deny-by-default: if a target isn’t on the list byte-for-byte, the call doesn’t happen.
  • TBAC single-use, task-bound tokens that burn on first use — a stolen token is useless outside its task, and useless twice.

In the box

What ships today

  • Deny-by-default posture on every MCP tools/call
  • Exact-string target allowlists, matched byte-for-byte
  • Wildcards deliberately unsupported in allowlists
  • redirect_uri and target validation against authorized entries
  • Shell invocations rejected outright, no evaluation needed
  • TBAC tokens: single-use, bound to one task
  • Tokens burn on first use — replay refused
  • Every MCP verdict signed into the decision ledger

As shipped in AnchorGate v0.1 — every line above is checkable against the repository.

FAQ

MCP security questions

Why are wildcards deliberately unsupported?
Because wildcard allowlists are how MCP integrations get exfiltrated: a pattern like *.example.com is one DNS rebinding away from matching an attacker’s host. Exact-string matching is more work to configure and we accept that trade-off — the allowlist should name what you actually authorized, byte-for-byte, nothing else.
What is a task-bound token, concretely?
A credential minted for one task that burns on first use. If it leaks in transit, in a log, or through a compromised agent, it fails twice over: it doesn’t authorize anything outside its task, and by the time an attacker replays it, it has already been spent. The refused replay lands on the signed record.
Does this replace authentication on my MCP servers?
No — it sits in front of it. Your MCP servers keep whatever auth they have; AnchorGate adds a gate that decides whether the call should happen at all: is the target authorized exactly, is a shell involved, is the token still valid for this task. Defense in depth, with the verdict signed either way.

Assume the token will leak. Gate the call anyway.

Put a deny-by-default MCP gateway between your agents and their tools. Exact-string allowlists, shell rejection, single-use tokens — all open source.

Deploy the stack

or email hello@anchorgate.ai