Topic 1: Module 1 at a glance, and the setup
By the end of this module, you'll have:
- A clear, numbers-backed answer to "why does MCP exist?", including the N applications times M tools arithmetic and a decision table for when MCP is the wrong tool.
- The running project's two foundation files,
notes_assistant/store.pyandnotes_assistant/llm.py, read line by line and exercised against Nare's eight sample notes. - The same "search my notes" capability built two ways: once with native function calling and once as a real MCP server with one
search_notestool, reached by a client in memory and over stdio. - Real JSON-RPC 2.0 messages for
tools/listandtools/call, captured withcurlagainst the 2026-07-28 wire format, plus the errors you get when you leave out a required header or envelope key. - A working mental model of hosts, clients, servers, the three server primitives, elicitation, and the three control models.
- A map of how the protocol evolved from 2024-11-05 to 2026-07-28, and a habit for following Specification Enhancement Proposals so the next revision does not surprise you.
Prerequisites: working Python 3.11, HTTP and JSON, basic async/await, and having called an LLM API at least once. No earlier module is needed; this is the start of the course.
Where we are: this is the first module. Before writing any protocol code we look at the problem MCP solves, meet the notes project that runs through all eleven modules, and build the smallest honest MCP server we can. Module 2 then opens up the protocol architecture and transports in depth.
How this module is organized
| Part | What it covers |
|---|---|
| Setup | Getting the notes-assistant repository running; every example runs in order from its root |
| Part A: Why MCP exists | The N times M problem with real arithmetic, what a protocol standardises that an SDK cannot, MCP versus native function calling, REST, and agent-to-agent protocols, and when MCP is the wrong tool |
| Part B: The running project | Nare's notes folder, NoteStore (business logic with no MCP in it), and the chat() helper for Groq, Gemini, and Ollama |
| Part C: One capability, two ways | Native function calling with a hand-written schema, then the same search as an MCP server and client, plus a broken launch to diagnose |
| Part D: Core concepts | Hosts, clients, and servers; JSON-RPC 2.0 on the wire; tools, resources, prompts; elicitation and the deprecated sampling and roots; control models |
| Part E: How the protocol has evolved | Five revisions from 2024-11-05 to 2026-07-28, the major shifts, and following SEPs |
| Module Lab | One script that runs the store, the arithmetic, the schema comparison, three transports, and a scripted model turn |
| Project Milestone, Interview Questions, Other Tools and Providers, Coming Up | Where the project stands, practice answers, alternatives, and a preview of Module 2 |
Setup: the notes-assistant repository
Everything in this course lives in one repository called notes-assistant. The examples in this module run in order, from the repository root, in one terminal session: later examples import files that earlier ones created, and the shared setup below (virtual environment plus PYTHONPATH=.) is assumed by every command after it.
cd notes-assistant
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
export PYTHONPATH=.
python -c "import mcp, notes_assistant; from importlib.metadata import version; print('mcp', version('mcp'), 'ready')"Code explained
- In simple words: this is unpacking your toolbox before the first lesson: a private Python environment with the exact library versions the course was tested against.
- What happens:
python3.11 -m venv .venvcreates an isolated environment so the course does not disturb other projects.pip install -r requirements.txtinstalls the pinned versions:mcp==2.2.0(the official Python SDK, which speaks protocol revision 2026-07-28),openai==3.16.2(used only as an HTTP client for OpenAI-compatible LLM APIs),pyjwt==2.14.0(Module 7), andpytest==9.1.1(Module 5).export PYTHONPATH=.letsimport notes_assistantwork from any script inexamples/. The last line proves both packages import. - Comes out:text
mcp 2.2.0 readyIf you see
ModuleNotFoundError: No module named 'notes_assistant', you are not in the repository root or you skipped theexport. Every later command assumes both.