Appendix. A Refresher on Decorators
Decorators are a bit of syntactic sugar in Python that allow you to modify the behavior of a function without changing the code of the function itself. They work because functions are first-class objects in Python, which means, among other things, that you can pass functions as arguments to other functions. So when you decorate a function, the decorated function is passed as an argument to the decorator function, which then will call the decorated function at some point during the execution of the rest of its logic.
This is done by defining a wrapper() or handler() function within the body of the decorator
function definition (the name of the inner function doesn’t matter, these are just common conventions) that does its logic and calls the function that it
was passed, and that inner function is returned by the outer (decorator) function.
In the MCP Python SDK, the MCPServer API’s tool() decorator is a great example of this. Prior to v2, the low-level server also used decorators like
@server.call_tool() to wrap your tool functions in nested handler functions and add it to a handler dictionary, but now the low-level server
constructor takes handler functions directly as parameters.
Now, the high-level server API’s tool decorator has only a single inner function called decorator(), and all it does is take a function
as an argument and then calls add_tool() on the server instance, which adds the tool definition (as a Tool object) to the server’s ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access