RAG gives an answer from external knowledge. An assistant carries that knowledge through a conversation. A tool-using assistant can also request actions from the outside world.
These are separate upgrades: knowledge, context, and capabilities.
Consider this conversation:
User: I am travelling to Paris next week for four days. What does the policy allow? Assistant: Economy class, and booking must be at least seven days ahead. [§4.2] User: And the hotel? Assistant: Up to ₹8,000 per night in Paris. [§4.7] User: Find me one under that.
The phrase "the hotel" means a hotel in Paris, for four nights, below ₹8,000 per night. None of that appears in the last sentence. It comes from earlier turns.
Turn three is impossible without turn one. That is why context is state, not merely "a longer prompt."
Even after remembering the full conversation, the assistant has no live hotel inventory. Memory tells it what to search for. A tool gives it the capability to perform the search.
| Layer | What it adds | Paris example |
|---|---|---|
| Knowledge | Retrieval over trusted documents | Finds cabin and hotel rules |
| Context | State carried across turns | Remembers Paris, dates, and budget |
| Capabilities | Tools that reach outside systems | Searches live flights and hotels |
The model never directly touches the flight API.
It emits a structured request:
{
"name": "search_flights",
"arguments": {
"origin": "BOM",
"dest": "CDG",
"date": "2026-08-22",
"cabin": "economy"
}
}
Your application code validates the request, runs the API call using real credentials, and returns the result to the model.
The cabin: economy argument is important. The user did not say "economy." The model filled it from the retrieved policy. Knowledge is now shaping an action.
Without a standard interface, developers describe every tool inside the application:
tools = [{
"name": "search_flights",
"description": "Search current flight fares",
"parameters": {
"origin": "string",
"dest": "string",
"date": "string",
"cabin": ["economy", "business"]
}
}]
For one tool this is manageable. With dozens of changing tools:
The Model Context Protocol (MCP) makes tools and resources discoverable through a common interface.
The server owns the schemas. The client asks what is available at runtime:
session = connect("travel.corp/mcp")
tools = session.list_tools()
result = session.call_tool(
"search_flights",
{"origin": "BOM", "dest": "CDG"}
)
Add a new tool to the server and it appears during discovery. The agent application does not need a hand-copied schema or a redeploy simply to learn that the tool exists.
MCP standardises how capabilities are exposed and called. It does not decide:
Those remain responsibilities of your application and agent design.
Context remembers the thread, tools reach the outside world, your code executes every action, and MCP provides a standard way to discover and call capabilities.