Model Context Protocol servers give agents access to databases, APIs, and production systems. Without authentication and authorization boundaries, any developer’s laptop can become a security risk. The problem is not theoretical: a junior engineer testing an agent locally can accidentally grant it production database credentials if the MCP server configuration lives in a shared repo without access controls.
Bifrost is an open-source MCP gateway that adds OAuth 2.0, role-based access control (RBAC), and tool-level filtering between your application and MCP servers. It does not auto-execute tool calls. Instead, it treats tool suggestions as proposals that your application must explicitly approve and execute via API.
Architecture: Gateway as Authorization Boundary
Bifrost sits between your agent orchestration layer and MCP servers. It enforces three security boundaries:
- Virtual keys map to specific MCP server configurations. A key with no
mcp_configsgets zero tools. - Tool filtering uses allowlists and denylists at the server level. Unlisted clients are implicitly blocked.
- Human-in-the-loop execution requires your application to call
POST /v1/mcp/tool/executeafter reviewing the LLM’s tool suggestions.
The gateway does not forward tool calls automatically. When an LLM returns a tool call, Bifrost exposes it as a suggestion. Your application inspects the tool name, parameters, and target server, then decides whether to execute.
Agent Orchestrator
|
| 1. Chat request with virtual key
v
+-----------------------------------+
| Bifrost Gateway |
| +---------------------------+ |
| | OAuth 2.0 Token Validation| |
| +---------------------------+ |
| +---------------------------+ |
| | RBAC: Role → Tool Mapping | |
| +---------------------------+ |
| +---------------------------+ |
| | Tool Allowlist Filter | |
| +---------------------------+ |
+-----------------------------------+
|
| 2. Filtered tool list
v
MCP Servers (Database, Slack, etc)
Your application receives tool suggestions, not executed results. You control the final execution step.
OAuth 2.0 at the Gateway Layer
Bifrost validates OAuth 2.0 tokens before routing requests to MCP servers. Token validation happens at the gateway, not inside individual tool servers. This centralizes authentication and prevents each MCP server from implementing its own token logic.
The flow:
- Your application obtains an OAuth 2.0 token from your identity provider (Okta, Auth0, etc).
- The application includes the token in the
Authorization: Bearer <token>header when calling Bifrost. - Bifrost validates the token against your configured JWKS endpoint.
- If valid, Bifrost maps the token’s claims (user ID, roles) to a virtual key and its associated MCP configurations.
- Only tools in the allowlist for that virtual key are exposed to the LLM.
This approach decouples authentication from tool logic. MCP servers do not need to know about OAuth. They receive requests from Bifrost, which has already validated the caller’s identity.
RBAC for Agent Principals
Role-based access control in agent systems maps agent identity to roles, not human users. Bifrost uses virtual keys as the principal. Each virtual key has:
- A set of roles (e.g.,
data_analyst,customer_support) - A list of MCP server configurations
- Tool allowlists and denylists per server
When an agent makes a request, Bifrost checks:
- Does the virtual key exist?
- Does the key’s role grant access to the requested MCP server?
- Is the requested tool in the allowlist for that server?
If any check fails, the tool is hidden from the LLM’s tool list. The agent never sees tools it cannot use.
Example virtual key configuration:
{
"key_id": "vk_prod_analyst_001",
"roles": ["data_analyst"],
"mcp_configs": [
{
"server_id": "postgres_prod",
"tool_allowlist": ["query_sales", "query_inventory"],
"tool_denylist": ["drop_table", "grant_permissions"]
}
],
"rate_limits": {
"requests_per_minute": 100,
"tokens_per_day": 1000000
},
"created_at": "2026-08-01T00:00:00Z",
"expires_at": "2027-08-01T00:00:00Z"
}
An agent using this key sees only query_sales and query_inventory. It cannot discover or request drop_table.
Tool-Level Access Control Without Breaking Discovery
MCP’s dynamic tool discovery means agents learn available tools at runtime. Bifrost filters the tool list before it reaches the LLM. The agent never knows about tools it cannot access.
When an agent requests tools from Bifrost:
- Bifrost queries all configured MCP servers for their tool lists.
- It applies the virtual key’s allowlist and denylist to each server’s tools.
- It returns the filtered tool list to the agent.
If an agent tries to execute a tool not in its allowlist, Bifrost returns a 403 Forbidden error. The tool execution endpoint checks permissions again, even if the tool somehow appeared in the discovery phase.
This double-check prevents privilege escalation if an attacker manipulates the tool list in transit.
Human-in-the-Loop Execution Flow
Bifrost does not auto-execute tool calls. The LLM returns tool suggestions. Your application must explicitly call the execution endpoint.
Standard flow:
- Agent sends a chat request to Bifrost with a virtual key.
- Bifrost forwards the request to the LLM with the filtered tool list.
- LLM returns a response with tool call suggestions (not executions).
- Your application inspects the tool calls: tool name, parameters, target server.
- If approved, your application calls
POST /v1/mcp/tool/executewith the tool call details. - Bifrost validates permissions again, executes the tool, and returns the result.
This gives you an approval gate. You can log tool calls, require manual approval for high-risk tools, or apply additional business logic before execution.
Example execution request:
{
"server_id": "postgres_prod",
"tool_name": "query_sales",
"parameters": {
"start_date": "2026-01-01",
"end_date": "2026-01-31"
}
}
Bifrost checks the virtual key’s permissions, executes the tool if allowed, and returns the result.
Audit Logs and Observability
Bifrost logs every tool discovery request, tool execution, and permission denial. Logs include:
- Virtual key ID
- User ID (from OAuth token claims)
- Tool name and parameters
- Execution result or error
- Timestamp
You can forward logs to your SIEM or observability platform (Datadog, Splunk, etc). This gives you a complete audit trail of agent actions.
For high-risk tools (database writes, API calls that modify state), you can configure alerts when execution happens. This helps detect anomalous agent behavior.
Deployment Shape and Failure Modes
Bifrost runs as a stateless HTTP service. You can deploy it as:
- A sidecar container next to your agent orchestrator
- A standalone service behind a load balancer
- A serverless function (AWS Lambda, Cloud Run) if you handle cold start latency
State (virtual keys, MCP configurations, RBAC rules) lives in a database (Postgres, MySQL). Bifrost queries the database on each request. This adds latency (typically 10-50ms) but keeps the gateway stateless and horizontally scalable.
Failure Modes
Understanding these failure modes helps you design resilient deployments and plan for degraded operation scenarios.
| Failure | Impact | Mitigation |
|---|---|---|
| Database unavailable | All requests fail with 503 | Use a managed database with automatic failover. Cache virtual key configs in Redis for read-heavy workloads. |
| OAuth provider down | Authentication fails, no tool access | Implement token caching with TTL. Use a secondary auth method (API keys) for critical workflows. |
| MCP server unreachable | Tool execution fails, agent gets error | Retry with exponential backoff. Return partial results if some servers succeed. |
| Tool allowlist misconfigured | Agent cannot access needed tools | Version control allowlists. Test changes in staging. Use infrastructure-as-code for config management. |
| Gateway overloaded | High latency or timeouts | Horizontal scaling behind a load balancer. Rate limit per virtual key. Use circuit breakers for slow MCP servers. |
The biggest operational risk is allowlist drift. If you add a new tool to an MCP server but forget to update the allowlist, agents cannot use it. Automate allowlist updates or use a “default allow” mode in non-production environments.
Performance Optimization: Code Mode for Token Efficiency
Bifrost supports “Code Mode” for MCP servers. Instead of sending the full tool schema to the LLM, it sends a compact code representation. This reduces token usage when orchestrating many MCP servers.
Example: A tool schema might be 500 tokens. Code Mode represents it in 50 tokens. For 20 tools, you save 9,000 tokens per request.
Code Mode is useful when:
- You have many MCP servers with large tool schemas.
- You are using a token-limited LLM (GPT-4 with 8k context).
- You want to reduce API costs.
Trade-off: The LLM sees less detail about each tool. It may generate incorrect parameters or misunderstand tool behavior. Test Code Mode with your specific tools before using it in production.
Technical Verdict
Use Bifrost when:
- You need to give agents access to production systems (databases, APIs, internal tools).
- You have multiple teams or agents with different permission levels.
- You want a centralized audit trail of agent actions.
- You need OAuth 2.0 or SSO integration for agent authentication.
- You want to prevent auto-execution of tool calls and require human approval.
Avoid Bifrost when:
- You are building a prototype or side project with no production data.
- All agents have the same permissions (no need for RBAC).
- You can enforce security at the MCP server level (each server has its own auth).
- You need sub-10ms latency for tool execution (gateway adds overhead).
- You prefer a managed service over self-hosted infrastructure.
Bifrost is infrastructure, not a product. You will spend time configuring virtual keys, allowlists, and RBAC rules. If your agent workload is small or low-risk, simpler approaches (API keys, environment variables) may be enough. If you are deploying agents that touch customer data or production systems, the gateway model gives you the security boundaries you need.