Topic 1: Module 3 at a glance, and the setup
3 min read·22 Sept 2026
By the end of this module, you'll have:
- A prototype server,
examples/m03_server.py, whosesearch_notesandcreate_notetools match the course's final design: bounded inputs, output schemas, honest annotations, and errors the model can act on. - The habit of reading the JSON Schema the SDK generates, so you can predict exactly what the model will see before you ship a tool.
- A tool-selection eval with 20 labelled questions, a deterministic stand-in selector, a real-model mode, and the statistics to tell an improvement from noise.
- A working map of tool failures (validation,
ToolError, crash,MCPError), what each one shows the model, and how to keep internals out of all of them. - Real measurements of two design choices: result size with inline payloads versus resource links, and the context cost of 2 versus 12 tools.
- A tool list that changes at runtime, with a client that hears about it through
subscriptions/listen.
Prerequisites: Module 1 (the NoteStore class and the llm.py helper) and Module 2 (JSON-RPC messages, the two transports, content types and resource links, and the in-memory Client). You need Python 3.11 and the course virtual environment.
Where we are: Module 2 showed how messages travel between client and server. This module zooms in on the primitive the model actually drives. Tools are where most MCP servers succeed or fail, because a tool definition is read by two audiences at once: your code, which needs a strict contract, and a language model, which needs clear instructions.