Concept deep dive·7 min read·22 August 2026

MCP Tools Resources Prompts Difference: A Production Guide

The mcp tools resources prompts difference determines security, token cost, and exam outcomes. This guide explains all three MCP primitives with real examples.

By Solomon Udoh · AI Architect & Certification Lead

MCP Tools Resources Prompts Difference: A Production Guide

Understanding the mcp tools resources prompts difference is foundational to any production MCP deployment. The three primitives look superficially similar in a server manifest, but they carry different capability shapes, different security surfaces, and different token costs. Reach for the wrong one and you either over-expose your system or under-serve your model.

This guide unpacks all three, shows representative definitions, and maps them to the exam scenarios you will encounter in Domain 2: Tool Design and MCP Integration.

What Is the MCP Tools Resources Prompts Difference in Summary?

MCP defines three server-side primitive types. Each is surfaced differently to clients and consumed differently by models.

PrimitiveInitiated byHas side effects?Injected asExam domain
ToolModel (via tool_use)Typically yestool_result blockDomain 2: 18%
ResourceClient applicationNoContext contentDomain 2: 18%
PromptUser or clientNoMessage sequenceDomain 2: 18%

The initiator column is the sharpest dividing line. Tools are model-controlled: Claude decides when to call them. Resources and prompts are client-controlled: the host application decides when to load them.

What Are MCP Tools and When Should You Use Them?

Tools are executable functions the model can invoke to perform actions or retrieve computed information. They are the MCP primitive with the largest blast radius: a tool can write a file, send an email, or mutate a database record. Claude calls a tool by emitting a tool_use content block; the MCP client routes the call to the server; the server executes and returns a result; the client appends a tool_result block before the next model turn. See the tool result appending concept for how this interacts with the agentic loop.

A minimal tool definition in a server manifest:

json
{
"name": "create_issue",
"description": "Opens a new issue in the project tracker. Use when the user asks to file a bug or feature request.",
"inputSchema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"body": { "type": "string" },
"labels": { "type": "array", "items": { "type": "string" } }
},
"required": ["title", "body"]
}
}

The description field is the primary routing mechanism. The model reads it to decide whether this tool fits the user's request. Vague descriptions are the most common source of tool misrouting in production. Our concept on writing effective tool descriptions covers the failure modes in detail.

Because tools can have side effects, they present the largest security surface of the three primitives. Every tool is a potential injection vector: a hostile document could instruct the model to call delete_records if the tool exists and the description does not constrain the call site. Least-privilege design, including splitting broad tools into narrow, constrained variants, is a core CCAR-F exam skill.

Tools are a powerful primitive in the Model Context Protocol that enable servers to expose executable functionality to clients.

Anthropic , Model Context Protocol Specification

What Are MCP Resources and How Do They Differ from Tools?

Resources expose data without executing logic. They are read-only endpoints: a server registers a set of URIs and, when a client requests one, returns its content as text or binary. The model cannot invoke a resource directly; instead, the host application fetches the resource and injects the content into the context window.

A typical resource definition:

json
{
"uri": "file:///etc/app/config.yaml",
"name": "Application config",
"description": "Current production configuration. Read-only.",
"mimeType": "text/yaml"
}

Resources are well suited to static or slowly-changing data: configuration files, knowledge-base articles, database schema definitions, API reference documents. They are poorly suited to anything that requires computation at fetch time or that changes faster than a session boundary.

The token economics differ from tools. A tool result is injected as a tool_result block and is relatively compact. A resource load injects the full content of the URI, which can be substantial. For large content catalogs, lazy loading, where only the resource URIs are listed up front and content is fetched on demand, is preferable to eager pre-loading. Our concept page on MCP resources for content catalogs covers the tradeoffs.

Because resources are read-only and client-initiated, their security surface is narrower than tools. The main risk is information disclosure: a poorly scoped URI pattern can expose files the model should never see. Enforce path-level access controls at the server, not at the prompt layer.

Resources represent any kind of data that an MCP server wants to make available to clients, including file contents, database records, live system data, and more.

Anthropic , Model Context Protocol Specification

What Are MCP Prompts and What Problem Do They Solve?

Prompts are the least understood of the three primitives. They are reusable message templates with named arguments that a server registers and a client can retrieve to seed a conversation. Unlike tools (model-controlled) and resources (client-controlled, data-only), prompts are user-facing: they typically appear in a slash-command palette or workflow picker in the host UI.

A prompt definition:

json
{
"name": "summarise_thread",
"description": "Generates a summary of a support thread.",
"arguments": [
{
"name": "thread_id",
"description": "The support thread identifier",
"required": true
}
]
}

When a user selects this prompt, the client calls prompts/get with the argument values, and the server returns a structured message sequence (system message, user message, or both) that the client inserts into the conversation. The model never sees the raw prompt definition; it only sees the rendered messages.

Prompts solve a specific problem: standardising complex, multi-step instructions across teams. Instead of each user typing a long directive by hand, the server encodes it once as a named, parameterised template. For compliance-heavy workflows, this creates an auditable artefact: the exact instruction set that initiated a conversation is logged at the server, not inferred from user messages.

The downside is prompt injection risk during prompts/get. If argument values are user-supplied strings, validate them server-side before interpolating into the returned messages.

Which Primitive Should You Choose?

The decision rule is mechanical once you know the initiator and side-effect profile.

text
Does the operation change state or call an external API with side effects?
Yes --> Tool
Does the operation return data the model should read but not execute?
Yes --> Resource
Does the operation produce a message sequence to seed or extend a conversation?
Yes --> Prompt

Edge cases worth noting for exam scenarios:

  • A search index is almost always a Tool, not a Resource, because the query is dynamic and computed at invocation time.
  • A product catalogue loaded at session start is almost always a Resource, not a Tool, because it is static and the model reads it passively.
  • A compliance disclaimer injected before every conversation is almost always a Prompt, not a system-prompt string, because it benefits from versioning and server-side logging.

For multi-server deployments where the same data could be exposed as either primitive, prefer the one that matches the access pattern rather than the data type. Our guide on MCP server integration best practices covers coordination across overlapping servers.

How Does the CCAR-F Exam Test These Distinctions?

Domain 2 (Tool Design and MCP Integration) carries 18% of the CCAR-F exam weight, per the official exam guide. The CCAR-F costs $125 per attempt with a passing score of 720 on a 100 to 1000 scale across 60 items in 120 minutes. Scenario items typically present a system design and ask which primitive best fits the described behaviour.

Common scenario patterns:

  1. Misclassification: A team exposes a frequently-read reference document as a tool returning its content. The correct fix is to reclassify it as a resource, reducing the security surface and tool catalogue size.
  2. Missing prompt abstraction: A team encodes a long compliance instruction in every user message. The correct fix is to move it to a server-registered prompt so it is versioned and auditable.
  3. Resource vs. tool for dynamic data: A server registers a live price feed as a resource URI. The correct fix is to expose it as a tool because the data is computed at query time and resource caching introduces unacceptable staleness risk.

The exam consistently rewards designs that match the primitive to the access pattern. The tool descriptions as selection mechanism concept underpins most of these scenarios: a description that encroaches on resource or prompt responsibilities is a design smell the exam reliably penalises.

As of 3 June 2026, more than 10,000 individuals have earned a Claude certification. Knowing the precise mcp tools resources prompts difference distinguishes candidates who have built production MCP systems from those who have only read the documentation.

What Are the Token Costs of Each Primitive?

Token efficiency is a production concern the exam also touches. The three primitives inject tokens differently:

Primitive componentWhere tokens appearTypical size
Tool definitionTool list in API callSmall: schema only
Tool resultConversation, tool_result blockVaries: computation output
Resource contentContext window, client-injectedCan be large: full document
Prompt (rendered)Conversation messagesMedium: template plus values

Resources carry the highest risk of context bloat. A server that pre-loads all registered resource URIs at session start can consume tens of thousands of tokens before the user types a single character. The mitigation is lazy loading: list resource URIs at startup and fetch content only when needed.

Tools inject tokens only when called and only for the specific result returned, making them more token-efficient for infrequently-accessed data. Prompts occupy the middle ground: the rendered message sequence is typically a few hundred tokens, injected once at conversation start rather than accumulated across turns.

Frequently asked questions

Can an MCP server expose tools, resources, and prompts simultaneously?
Yes. A single MCP server can register all three primitive types. They are independent capability categories, and most production servers expose more than one. The client discovers available primitives via separate list requests: tools/list, resources/list, and prompts/list. Each category is optional; a server may expose only the primitives relevant to its purpose.
Do MCP resources support binary content such as images or PDFs?
Yes. MCP resources can return both text and binary blob content. The server specifies the MIME type in the resource definition; the client handles rendering. Text resources are injected as strings; binary resources arrive as base64-encoded blobs. Most LLM context injection uses text, but the protocol accommodates arbitrary MIME types including images and PDFs.
What is the difference between an MCP prompt and a system prompt?
A system prompt is set by the host application and injected at the top of every conversation as a static string. An MCP prompt is a server-registered template selected explicitly by a user or client, triggering a prompts/get call that returns a structured message sequence. MCP prompts are versioned, parameterised, and auditable at the server; system prompts are developer-set and opaque to auditors.
Should I expose frequently-read reference data as an MCP tool or resource?
Use a resource. Resources are read-only and client-initiated, carrying no execution risk and presenting a smaller security surface than tools. Reserve tools for operations that compute a result dynamically or have side effects. Exposing static reference data as a tool forces unnecessary tool-call overhead and bloats the tool catalogue, increasing the risk of misrouting.
How do I prevent prompt injection through MCP prompt arguments?
Validate all user-supplied argument values server-side before interpolating them into the returned message sequence. Treat arguments as untrusted input even when the client claims to have sanitised them. Use an allowlist of safe characters where possible, reject arguments containing instruction-like strings, and log the final rendered message for each prompts/get call to support forensic investigation.
What happens to tool results that exceed the model's context window?
The MCP protocol does not automatically truncate tool results. If a result is too large, the combined conversation exceeds the model's context window and the request fails. Design tools to return summaries or paginated slices by default and enforce a maximum result size at the server, returning a structured error if the full output cannot be delivered safely.

People also ask

What is the difference between MCP tools and resources?
Tools are model-invoked and can have side effects; a tool executes logic when called and returns a computed result. Resources are client-loaded and read-only; a resource exposes a data URI that the client fetches and injects into the context window. The model cannot request a resource directly the way it invokes a tool via a tool_use block.
What are MCP prompts used for?
MCP prompts are reusable message templates a server registers and a client retrieves via prompts/get. They standardise complex instructions across teams, appear in host UIs as slash commands or workflow pickers, and produce auditable records of the instructions that seeded a conversation. They are user-initiated rather than model-initiated, distinguishing them from both tools and resources.
Can Claude invoke MCP resources directly?
No. Resources are client-controlled, not model-controlled. The host application decides when to fetch a resource and inject its content into the context window. Claude reads the injected content as part of the conversation but cannot request a resource URI the way it invokes a tool via a tool_use content block. Resource loading is always an application-level decision.
Do MCP resources increase token usage?
Yes. A resource's full content is injected into the context window when the client loads it. Large resources or many pre-loaded resources can consume substantial tokens before the user types a single message. Prefer lazy loading: list resource URIs at session start and fetch content only when the agent actually needs it, rather than pre-loading the entire catalog upfront.
What is the difference between MCP tools and function calling?
Function calling via the Messages API tools parameter is a native Claude feature for model-invoked execution. MCP is a transport and discovery layer standardising how servers expose that capability to clients. MCP tools map closely to function-calling tools; resources and prompts have no direct function-calling equivalent. MCP adds server-side versioning, capability discovery, and multi-server routing on top.

About the author

Solomon Udoh

AI Architect & Certification Lead

Solomon Udoh is an AI Architect who designs and ships production agent systems on the Claude API and Claude Code. He built AI Skill Certs' adaptive engine and authored its 174-concept knowledge graph, mapping every Claude Certified Architect - Foundations objective to hands-on, exam-aligned practice.

  • Designs production multi-agent systems on the Claude API and Agent SDK
  • Author of the AI Skill Certs knowledge graph (174 mapped exam concepts)
  • Builds with MCP, Claude Code, structured outputs, and agentic loops daily
  • Reviews every concept page against the official Anthropic exam guide

You might also like

Ready to put it into practice?

Study every exam concept with an adaptive tutor.

Start studying