Ask a language model to write 1987 in Roman numerals and it will usually get it right. Ask it to spell out 975.07 as words for a cheque, convert a timestamp in a timezone it has never heard of, or tell you whether a domain has mail servers right now, and "usually" stops being good enough. The model is predicting text. Some questions need a computation or a lookup, and the honest move is to hand them to something that does that job deterministically.
That handoff is a tool call, and the Model Context Protocol (MCP) is the standard way to wire one up. It is an open protocol, published at modelcontextprotocol.io, that defines how an AI application discovers what a service can do and asks it to do it. This lesson takes it apart: the three kinds of thing a server can offer, who the parties are, what goes over the wire, and how the model ends up choosing a tool at all.
Tools, resources and prompts
An MCP server can expose three kinds of capability. The difference between them is not the data format. It is who decides when they are used.
| Primitive | Controlled by | What it is | Typical example |
|---|---|---|---|
| Tools | The model | A function with a name, a description and a JSON Schema for its arguments. The model decides to call it. | Convert a number to words, validate an email, query a database |
| Resources | The application | Read-only context identified by a URI, which the host app chooses to attach. | A file, a database schema, a document |
| Prompts | The user | A reusable template the user picks, often surfaced as a slash command. | "Summarise this pull request" |
Most of the attention goes to tools, because tools are where an agent gains the ability to act on the world rather than just talk about it. Resources are the right shape for context that the app already knows it wants loaded. Prompts are a way for a server author to ship a well-tuned instruction alongside the capability it drives.
The APIVerve MCP server implements tools only. Its documentation is explicit: it answers initialize, tools/list and tools/call, and there are no resources or prompts, because the catalog is a set of callable endpoints and there is nothing static to mount. That is a perfectly normal server profile. Many production servers expose only tools.
A server author wants the host application, not the model, to decide when a project's database schema is loaded into context. Which primitive fits?
Answer the check above to continue.
How the model decides to call a tool
The model never calls anything. It is worth being precise about the loop, because every agent bug you will chase lives somewhere in it.
- The host takes the tool list it received and puts each tool's name, description and input schema into the model's context, in whatever format that model's API expects for function calling.
- The user asks something. The model, reading the conversation and the tool descriptions, can respond with text or with a structured request to use a tool, including arguments it generated to fit the schema.
- The host decides whether to honour that request. It may run it at once, or ask the user to approve it first.
- The client sends
tools/call, the server does the work, and the result goes back into the model's context. - The model reads the result and either answers or asks for another tool.
So the model's choice is driven entirely by text it was given: the tool's name and description, the parameter descriptions, and anything the server said in its instructions. A vague description gets a tool called at the wrong time or not at all. A precise one gets it called exactly when it should be. Lesson 3 is about writing and reading those descriptions.
Here is the kind of question that should trigger a tool. Roman numeral conversion has one right answer, and a lookup is cheaper than a mistake on a legal document or a building plaque:
curl "https://api.apiverve.com/v1/romanconverter?number=1987" \
-H "x-api-key: YOUR_API_KEY"roman is MCMLXXXVII, and breakdown shows how it was built.
The tool also changes how much you can trust the answer. A model that says "MCMLXXXVII" from memory gives you a claim. A model that called a converter gives you a claim plus a record of the call in the transcript, and that record is what you check when something looks off.
Why a protocol instead of bespoke integrations
Before MCP, connecting a model to a service meant writing glue for each pair. Every model provider had its own function-calling format, every host app had its own plugin system, and a service that wanted to be usable from five assistants maintained five integrations. Every new host multiplied the work again.
A protocol turns that multiplication into addition. A service writes one server; every host that speaks MCP can use it. A host implements one client; every MCP server works in it. The tool definition in JSON Schema is the shared language, and each host translates it into its own model's function-calling format internally.
There is a second benefit that matters more over time: discovery happens at connection time, not at build time. APIVerve generates its tool list from the same catalog its REST API runs on, so a new endpoint is a new tool the day it ships, without anyone editing a config. A bespoke integration would have hard-coded the list the day someone wrote it.
The protocol is not free of cost, and an experienced engineer should name the tradeoffs:
- Context is a budget. Every tool definition occupies tokens in the model's context, and a long list makes the choice harder. Exposing hundreds of tools to an agent with one job is usually a mistake, which is why the single-tool endpoint you used above exists.
- Trust is now a design question. A server's descriptions and results flow straight into the model. A server you do not control can say anything, and lesson 4 covers what that means for safety.
- The standard moves. Protocol versions are dated (2024-11-05, 2025-03-26 and 2025-06-18 are all accepted by the APIVerve server, which echoes back the version your client asked for). Newer features such as structured output only appear when both sides support them, so you check the negotiated version rather than assume.
None of those are reasons to write bespoke glue instead. They are the things you design around.
Your agent answered a currency question confidently, but the transcript shows no tool call. What is the most likely explanation?
Next
You have seen a tool listed, called and failed by hand. Next you will connect the APIVerve server to a real client, prove the connection works with a call that costs one credit, and learn the handful of mistakes that account for nearly every "the tools don't show up" report: Connect the APIVerve MCP server.