CourseModel Context Protocol · Module 1: Foundations · part 1 of 83
Part 1 · Module 1: Foundations

Topic 1: Module 1 at a glance, and the setup

3 min read·22 Sept 2026

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.py and notes_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_notes tool, reached by a client in memory and over stdio.
  • Real JSON-RPC 2.0 messages for tools/list and tools/call, captured with curl against 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

PartWhat it covers
SetupGetting the notes-assistant repository running; every example runs in order from its root
Part A: Why MCP existsThe 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 projectNare'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 waysNative 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 conceptsHosts, 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 evolvedFive revisions from 2024-11-05 to 2026-07-28, the major shifts, and following SEPs
Module LabOne 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 UpWhere 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.

bash
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 .venv creates an isolated environment so the course does not disturb other projects. pip install -r requirements.txt installs 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), and pytest==9.1.1 (Module 5). export PYTHONPATH=. lets import notes_assistant work from any script in examples/. The last line proves both packages import.
  • Comes out:
    text
    mcp 2.2.0 ready

    If you see ModuleNotFoundError: No module named 'notes_assistant', you are not in the repository root or you skipped the export. Every later command assumes both.