Tools, resources and prompts

Model Context Protocol (MCP) · Essentials · 10 min

Picking the right primitive makes your server behave naturally in every host.

An MCP server can offer three kinds of thing, called primitives. The easiest way to tell them apart is to ask who decides to use it.

  • Tools are chosen by the model. A tool is a function with a name, a description and an input schema (a description of the arguments). Examples: create_issue, run_query, send_email. Tools can change things.
  • Resources are chosen by the application. A resource is a piece of read-only data identified by a URI (an address like file:///notes/todo.md or notes://groceries). The host or the user attaches it to the conversation as context, like attaching a file to an email.
  • Prompts are chosen by the user. A prompt is a reusable message template with arguments, often shown as a slash command such as /summarize-note. Picking it fills in a ready-made message.

If you know web APIs: a resource is like a GET (load data, change nothing), a tool is like a POST (do work, maybe with side effects). A prompt is like a saved query the user runs by name.

A resource with a placeholder in its address, like notes://{title}, is a resource template: the client fills in the placeholder to read a specific item.

Most servers start with tools, because every host supports them and the model can use them without the user doing anything. Hosts differ in how they show resources and prompts, so check what yours supports.

Remember

  • Tools: model-controlled actions
  • Resources: application-controlled, read-only data addressed by URI
  • Prompts: user-controlled message templates
  • A URI with {placeholders} is a resource template

Watch out for

  • Exposing read-only lookups only as resources when the model must decide to fetch them; many hosts never let the model pick resources, so make those lookups tools.

Check yourself

  1. You want users to type a slash command that starts a code review conversation. Which primitive fits?
  2. Which primitive is the model itself expected to call to take an action?

Sign in to answer, see the explanations, and get this lesson back as a quick review later.

Official docs: modelcontextprotocol.io/docs/2026-07-28/learn/server-concepts