AI agents
Model Context Protocol: Tools, Resources, and Prompts
Understand MCP roles, capabilities, versioning, authorization, and the security boundary between hosts and servers.
By the end you can
- Define Model Context Protocol integration as an operational contract rather than a capability label
- Contrast MCP tool with MCP resource in “An MCP client connected to a useful server and exposed more data than the user expected”
- Trace “Protocol interoperability does not create a universal trust boundary” through a concrete execution path
- Produce “Review an MCP connection before enabling it” with evidence for “Users can see which MCP capability is requested before a sensitive action”
Comparison
Competing strategies for Model Context Protocol integration
An MCP tool acts. An MCP resource is read. An MCP prompt shapes what the model is asked. A single connection dialog tends to flatten those three into one.
The specification does not treat them as equals. Its security section says that “Tools represent arbitrary code execution and must be treated with appropriate caution”. That is the 2025-06-18 wording, and revision 2026-07-28 keeps the sentence's substance as a Key Principle under Tool Safety.
The dialog flattens it anyway. Reading a project file and invoking a write-capable operation arrive at the user as the same checkbox. The integration works when a user can see which MCP capability is being requested before a sensitive action goes through. It fails when the shared protocol is mistaken for a shared trust boundary. It is not one.
The read side is not the safe side by default either. CVE-2025-53109 and CVE-2025-53110 were both found in the project's own reference Filesystem server.
MCP tool
A model-invocable operation with a declared input schema.
- Can cause side effects
- Needs approval policy
- Comparable to function tools
MCP resource
Contextual data exposed through protocol-defined discovery and read operations.
- Supports provenance
- May contain sensitive data
- Not automatically trusted
MCP prompt
A reusable prompt template supplied by a server.
- Improves portability
- Carries instructions
- Must not outrank host policy
Visual
The host grants consent, not the server
Host, client, server, capability: four named parts, and one boundary that does not sit evenly across them. The host is the program the user runs. The client is the connector it opens. The server is the thing on the other end, offering tools, resources and prompts.
Consent sits in exactly one of those four places. “Hosts must obtain explicit user consent before invoking any tool”, says the 2025-06-18 specification. Revision 2026-07-28 states the same principle: consent before invoking any tool, and before exposing user data to servers. Then it concedes the thing a reader of the diagram most needs to know. MCP itself cannot enforce any of this at the protocol level.
So the authorization boundary belongs to the host and the deployment, not to the wire format. Capability and the authorization boundary need separate owners and separate tests. A reader who cannot say which of the four parts grants consent has not yet understood the protocol.
- 1
Host
The AI application that manages users, models, consent, and policy.
- 2
Client
The protocol component that connects the host to one server.
- 3
Server
A local or remote provider of declared capabilities.
- 4
Capability
A tool, resource, prompt, task, or negotiated extension.
- 5
Authorization boundary
The rules controlling which identities may access which capabilities.
Negotiate protocol versions rather than assume timeless behavior
The Model Context Protocol standardizes how an AI application can discover and use server-provided tools, resources, and prompts.
It makes tools easier to plug in. The host still decides what the user is asked to consent to, what the server is allowed to do, how the request is shown, how the server is walled off, and which policy applies.
The version is not a detail that can be rounded off to “current”. The present revision is 2026-07-28, published on 28 July 2026. Its own normative schema says so: LATEST_PROTOCOL_VERSION = "2026-07-28" and JSONRPC_VERSION = "2.0". A host does not have to believe a blog post about which protocol it speaks. It can read the constant.
Negotiation looks more instructive still from the operator's side. One endpoint can carry two revisions at once, and the choice is made per request. Eichenberger and Chang, writing about AgentCore Gateway the day the revision landed, put it plainly: “Clients select a version on every request. Adding 2026-07-28 to a gateway that also advertises 2025-11-25 does not change anything for clients that request the older version.”
A host is therefore not on the newer revision because the server offers it. Production systems should negotiate and test versions rather than assume timeless behavior.
The protocol carries a date for a reason: a host that never asks which version it is speaking has hard-coded an assumption it will not notice breaking.
Case
What MCP specifies, and who governs it now
The specification is short about what it does and firm about what it does not. MCP carries JSON-RPC 2.0 messages between hosts, clients and servers. Servers offer resources, prompts and tools.
Its “Security and Trust & Safety” section then sets out Key Principles that read as warnings rather than as features. Tools represent arbitrary code execution. Hosts must obtain explicit user consent before invoking any tool and before exposing user data to servers. And what a server says about its own tools is not evidence about them. On that last point the text is blunt: “In particular, descriptions of tool behavior such as annotations should be considered untrusted, unless obtained from a trusted server.” The same section concedes that MCP cannot enforce any of this at the protocol level.
Governance moved on 9 December 2025. “Today, we're donating the Model Context Protocol (MCP) to the Agentic AI Foundation (AAIF), a directed fund under the Linux Foundation”, Anthropic wrote that day, alongside Block's goose and OpenAI's AGENTS.md. The same announcement cited more than 10,000 active public MCP servers and over 97 million monthly SDK downloads across Python and TypeScript. The Linux Foundation press release of the same date cited “more than 10,000 published MCP servers”.
For a reader deciding what to trust, hold those two facts together. The consent duty is normative and unenforceable at the protocol level. There are more than 10,000 published servers to which it applies. The host must ask, and nothing in the protocol says the server can be believed.
Example
The reference Filesystem server read outside the directories the user had approved
The official MCP reference Filesystem server takes a list of allowed directories. Twice, it read outside them.
CVE-2025-53109 covers symlinks placed inside an allowed directory (CWE-59). CVE-2025-53110 covers a path whose prefix merely collides with an allowed directory (CWE-22). The record for the second states it without hedging: “Versions of Filesystem prior to 0.6.4 or 2025.7.01 could allow access to unintended files in cases where the prefix matches an allowed directory.” Both were published on 2 July 2025 by GitHub as CNA, and both carry a CVSS v4.0 base score of 7.3 (HIGH). GitHub's advisory for the symlink variant, dated 1 July 2025, names the package: @modelcontextprotocol/server-filesystem.
Notice where the failure sits. The user approved a set of directories. The host displayed that approval as one permission covering the whole connection. Nothing distinguished reading a project file from reading a file two directories away that happened to share a prefix. The boundary the user believed they were consenting to lived inside the server's path-validation code, in a package published by the protocol's own project. It was not the boundary being enforced. No part of the protocol was violated while this happened.
- Decision at stake: whether approving one MCP connection approves a boundary the server actually enforces — here, the allowed-directory list handed to the official MCP reference Filesystem server.
- Hidden assumption: that an MCP-compliant server is automatically safe to trust. The enforcement the user relies on is a path check in that server's own code, not anything the protocol guarantees.
- Primary control question: protocol interoperability does not create a universal trust boundary. Before 0.6.4 or 2025.7.01 the same server followed symlinks out of an allowed directory (CWE-59) and accepted a prefix that merely collided with one (CWE-22).
- Evidence to collect: that users can see which MCP capability is requested before a sensitive action, and that the deployed server version is past the fix. Both CVEs were published on 2 July 2025 by GitHub as CNA, at CVSS v4.0 base score 7.3 (HIGH).
Key idea
Protocol interoperability does not create a universal trust boundary
A conforming server can still be compromised, overprivileged, misleading, or inappropriate for the current user. There is now a measured base rate rather than a worry. The first large-scale study of the ecosystem, posted on 16 June 2025, analysed 1,899 open-source MCP servers. Hasan and five colleagues identified eight distinct vulnerability types, only three of which overlap with traditional software vulnerabilities. Then they counted: “Additionally, 7.2% of servers contain general vulnerabilities, and 5.5% exhibit MCP-specific tool poisoning.” Tool poisoning in that population is not a scenario. It is a counted share.
First-party code is not exempt. The MCP project's own official Inspector debugging tool, created and at that time maintained by Anthropic, had no authentication between its client and its proxy. CVE-2025-49596, published on 13 June 2025 and assigned by GitHub as CNA, describes the consequence: “Versions of MCP Inspector below 0.14.1 are vulnerable to remote code execution due to lack of authentication between the Inspector client and proxy, allowing unauthenticated requests to launch MCP commands over stdio.” CVSS v4.0 base score 9.4, CRITICAL. CWE-306, Missing Authentication for Critical Function. Fixed in 0.14.1.
The attack also runs in the direction the architecture diagrams rarely draw. The server returns a crafted authorization_endpoint URL during the OAuth flow, and the client executes it. That is CVE-2025-6514, assigned by JFrog and published on 9 July 2025: “mcp-remote is exposed to OS command injection when connecting to untrusted MCP servers due to crafted input from the authorization_endpoint response URL”. Versions 0.0.5 through 0.1.15, fixed in 0.1.16. CVSS v3.1 base score 9.6 CRITICAL, CWE-78. That is the server compromising the host during the authorization handshake, before any tool is invoked and before any tool-consent dialog could have been shown.
Capability metadata helps discovery. It does not prove safety or legitimacy. The specification says as much when it calls tool annotations untrusted. Authorize per server and capability. Surface side effects, isolate credentials, and treat returned content as untrusted input.
Conformance says a server speaks the protocol correctly; CVE-2025-49596 and CVE-2025-6514 were both scored CRITICAL, and neither was written by an outsider to the ecosystem.
Steps
Review an MCP connection before enabling it
Before enabling an MCP connection, review it capability by capability rather than as a single switch. Five steps, and two of them now have citable content rather than advice.
Identify the server — operator, deployment location, transport, and update path. CVE-2025-6514 makes the update path a first-class question rather than hygiene. The distance between mcp-remote 0.1.15 and 0.1.16 is the distance between a client that executes a URL the server chose and one that does not.
Enumerate capabilities — separate reads, prompts, side effects, tasks, and extensions. Record which of them the connection dialog currently merges into one permission.
Map identities — determine whose credentials reach the server and downstream systems. Since revision 2026-07-28 this is normative, not a matter of house style. MCP servers MUST implement OAuth 2.0 Protected Resource Metadata (RFC 9728). MCP clients MUST implement Resource Indicators for OAuth 2.0 (RFC 8707, February 2020) and send the `resource` parameter in both authorization and token requests. Servers MUST validate that access tokens were issued specifically for them as the intended audience. In the specification's own words, “MCP servers MUST NOT accept or transit any other tokens.” RFC 8707 gives the mechanism behind that rule: “When the authorization server is informed of the resource that will process the access token, it can restrict the intended audience of that token to the given resource such that the token cannot be used successfully at other resources.” That is what “isolate credentials” means concretely. An audience-bound token is one that a server cannot replay at another server.
Design consent — show capability-specific purpose, data access, and consequence. Then check the screen against the case above. Would it have told a user that an approved-directory list is enforced by the server's own path check?
Test upgrades — validate protocol version, schema changes, deprecations, and authorization behavior. Clients select a version on every request, so test every revision the endpoint advertises, not only the newest.
- 1
Identify the server
Verify operator, deployment location, transport, and update path.
- 2
Enumerate capabilities
Separate reads, prompts, side effects, tasks, and extensions.
- 3
Map identities
Determine whose credentials reach the server and downstream systems.
- 4
Design consent
Show capability-specific purpose, data access, and consequence.
- 5
Test upgrades
Validate protocol version, schema changes, deprecations, and authorization behavior.
Adopting the protocol makes the consent screen yours
Teach MCP as an interoperability layer, not as an agent architecture. The host still needs its own runtime, state, evaluation, and governance.
The specification agrees, and says so against its own interest. It sets out consent and tool-safety principles as Key Principles, then concedes that MCP cannot enforce them at the protocol level. That concession is the whole argument of this lesson in one clause. The duty is written down in the protocol. The enforcement is not. It sits in the host: in the dialog it draws, the token audience it validates, the server version it pins, and the directory list it can actually prove is being honoured.
More than 10,000 MCP servers had been published by the December 2025 handover to the Agentic AI Foundation. Reviewing per server and per capability is therefore a volume problem, not a one-time exercise. Of the 1,899 servers in the study above, 7.2% carried general vulnerabilities. What the team owes its users does not change with the count: a clear view of which capability is being asked for before a sensitive action runs. The team that adopts the protocol owns the consent screen. The people who wrote the protocol do not.
Plugging in a server is the easy half; the runtime, the audit trail, and whoever answers for a bad action all stay on your side of the connection.
Key takeaways
- The Model Context Protocol standardizes how an AI application can discover and use server-provided tools, resources, and prompts. It carries JSON-RPC 2.0 messages between hosts, clients and servers.
- The current revision is 2026-07-28, and its normative schema sets LATEST_PROTOCOL_VERSION = "2026-07-28" and JSONRPC_VERSION = "2.0". Clients select a version on every request, so one endpoint can advertise both 2026-07-28 and 2025-11-25 at once.
- The specification's Key Principles place consent on the host and call server-supplied tool descriptions such as annotations untrusted — then concede that MCP cannot enforce either at the protocol level.
- Conformance is not safety. CVE-2025-49596 hit the project's own Inspector (CVSS v4.0 9.4, CWE-306, fixed in 0.14.1). CVE-2025-6514 hit mcp-remote (CVSS v3.1 9.6, CWE-78, fixed in 0.1.16). Both were first-party or widely used MCP code.
- Across 1,899 open-source MCP servers, the first large-scale study found eight distinct vulnerability types, 7.2% of servers with general vulnerabilities and 5.5% exhibiting MCP-specific tool poisoning.
- Authorize per server and capability: servers MUST implement RFC 9728, clients MUST implement RFC 8707 and send the `resource` parameter, servers MUST validate token audience. The host, not the protocol, still owns the consent screen.