CourseModel Context Protocol · Module 3: Tools · part 15 of 83
Part 15 · Module 3: Tools

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, whose search_notes and create_note tools 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.

The rest of this course is yours to keep

This course is bought on its own, once, and stays readable afterwards, including the parts added to it later.