MCP Tool Permissions: Security Best Practices
MCP tool permission best practices — scope exposure, read vs write tools, and application policy layers that complement protocol-level access.
MCP tool permissions define which capabilities an MCP host registers for a given agent session, what each tool may do, and how application policy complements connection-level access. The Model Context Protocol advertises tools with names and argument schemas — but permission to cause side effects is enforced by your host and server code, not by MCP itself.
Without explicit permissions, agents inherit the full tool manifest on an MCP server: writes, external calls, and bulk reads become available to a model that may be steered by prompt injection. MCP tool permissions translate AI agent permissions into concrete MCP registrations and policy rules.
Two permission planes
MCP deployments involve two distinct planes:
Plane 1: Connection / deployment
Who can open an MCP session to the server?
(network, gateway auth, host configuration)
Plane 2: Application policy
Which tools are registered for this agent?
Which proposed calls are allow / review / block?
(host orchestration + Agent Action Guard)
Plane 1 without Plane 2 means any authenticated host can invoke every tool. Plane 2 without Plane 1 means an unauthenticated client might reach the server directly. You need both.
MCP does not automatically enforce application policy. Your host must filter tool registration and evaluate each call before invocation.
Scoping tool exposure
Session tool allowlists
At session start, register only tools required for the task:
| Agent profile | Register | Omit |
|---|---|---|
| Support triage | search_tickets, get_customer | delete_customer, issue_refund |
| Refund workflow | above + create_refund (review) | admin_* |
| Internal ops | write tools with approval | arbitrary shell |
If a tool is not registered, the model cannot propose it in frameworks that respect tool lists — reducing excessive agency at the source.
Dynamic registration
For long-running workflows, add tools when the user escalates intent ("I need a refund") rather than exposing all write tools upfront. Revoke write tools when the sub-task completes. See Securing Long-Running AI Agents.
Multi-server composition
Connect hosts to multiple MCP servers with different credentials:
- Read server: broad search tools, read-only DB role
- Write server: narrow mutation tools, stricter ACL
Agents that only need lookup never receive a write server connection.
Read vs write vs destructive
Mirror the primary split from agent permissions:
| Class | MCP examples | Default posture |
|---|---|---|
| Read | list_files, get_record, search | Allow with logging |
| Write | update_ticket, send_message | Review or scoped allow |
| Destructive | delete, revoke_all, drop_table | Block or dual approval |
| External | fetch_url, post_webhook | Domain allowlist + review |
Name MCP tools so policy rules map cleanly. filesystem_read and filesystem_write beat one filesystem tool with a mode enum.
Agent Action Guard default policy blocks destructive keywords in action and context, allows read-only action prefixes, and blocks secret-bearing context.
Application policy layer
For each proposed MCP tool call, evaluate policy before the MCP client invokes the server:
async function invokeMcpTool(proposal: McpToolCall): Promise<ToolResult> {
const guard = await fetch("https://www.identicapi.com/api/v1/security/agent-action", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.IDENTICAPI_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
tool_name: proposal.server + ":" + proposal.tool,
action: proposal.tool,
arguments: proposal.arguments,
context: proposal.sessionContext
})
});
const result = await guard.json();
if (result.decision === "block") {
return { error: "blocked", reason: result.policy_reason };
}
if (result.decision === "review") {
return await enqueueApproval(proposal, result);
}
return mcpClient.callTool(proposal);
}
Enforcement is mandatory in your host. The API returns decision; only your code prevents execution.
Custom policy rules
Examples aligned with MCP naming:
{
"condition_type": "tool_name",
"condition_value": "mcp_billing",
"decision": "review"
}
{
"condition_type": "destructive_action",
"condition_value": "",
"decision": "block"
}
Rule reference: Agent Action Guard docs. Policy patterns overlap runtime security and policy decisions.
Tenant and data scope
Multi-tenant SaaS must bind MCP permissions to tenant context:
- Host passes authenticated
tenant_idfrom the user session — never from model-generated arguments alone - MCP server enforces row-level filters using host-supplied identity tokens
- Policy rules may include
data_scopeconditions for export or bulk read tools
Cross-tenant ID in arguments should trigger block or review. Combine with source-to-sink security to prevent untrusted web content from driving cross-tenant reads.
External and network permissions
MCP tools that fetch URLs or call webhooks need network permission models:
- Allowlisted domains per agent profile
- Block private IP ranges and metadata endpoints at server
- Review first contact to new domains
Browsing tools compound injection risk — see secure agent web browsing and web page prompt injection.
Permissions vs schemas
Tool JSON Schema ensures amount is a number; it does not ensure amount is within refund policy. Permissions answer authorization questions schemas cannot:
| Check | Schema | Permission / policy |
|---|---|---|
path is a string | Yes | Is path within allowlisted root? |
limit is integer | Yes | Is limit ≤ 100 for this role? |
recipient is email format | Yes | Is recipient in same tenant? |
Validate schema in the host for early rejection; validate permissions via validate AI tool calls pipeline before MCP invocation.
Auditing permission changes
Track:
- Tool manifest version deployed on each MCP server
- Host configuration which registers tools per agent type
- Policy ID and rule changes in Agent Action Guard
Unexpected tool appearing in manifest or new allow rule without review is a governance alert.
Best practices summary
- Minimize registered tools per session — least privilege.
- Split read/write tools and servers.
- Evaluate every call with Agent Action Guard before MCP invoke.
- Re-authorize on long sessions when scope escalates.
- Server-side checks duplicate host policy — never trust the model for tenant IDs.
- Screen tool outputs before re-prompting — permissions on invocation do not sanitize return path. See MCP prompt injection.
Operational checklist: MCP Security Checklist. Foundation: What Is MCP Security?.
Frequently asked questions
What are MCP tool permissions?
They define which MCP tools a host registers for a given agent session, what each tool may do, and how application policy complements connection-level access. Permissions span session tool allowlists and per-call allow, review, or block decisions.
What is the difference between connection auth and tool permissions?
Connection auth controls who can open an MCP session to a server. Tool permissions control which capabilities are available to the model and which proposed calls are permitted. Both are required; either alone is insufficient.
How do read vs write MCP tools affect permissions?
Split read tools (get, list, search) from write tools (update, send, create). Default read tools to allow with logging; route writes and external calls to review or block. Name tools so policy rules map cleanly to risk class.
Can JSON Schema on MCP tools replace permission checks?
No. Schema validates shape, not authorization. A well-formed delete or bulk export passes schema but may violate policy. Use schema validation plus Agent Action Guard policy evaluation before invocation.
How should permissions change during long agent sessions?
Re-register or revoke tools when task phase changes. Do not keep write tools registered for the entire session after a read-only sub-task ends. Require user confirmation before escalating from read to write scope.
Related reading
- What Is MCP Security?
MCP (Model Context Protocol) security for AI agents — tool exposure, authentication boundaries, untrusted content, and a…
- How to Secure MCP Servers Used by AI Agents
Secure MCP servers with authentication, least privilege, exposed tool review, transport boundaries, secrets handling, an…
- AI Agent Permissions: A Developer's Guide
Design agent permission models — scoped tools, read vs write actions, destructive operation controls, and policy-based d…