@@ -95,6 +95,7 @@ If you haven't created a uv-managed project yet, create one:
9595 ```
9696
9797Alternatively, for projects using pip for dependencies:
98+
9899``` bash
99100pip install " mcp[cli]"
100101```
@@ -134,11 +135,13 @@ def get_greeting(name: str) -> str:
134135```
135136
136137You can install this server in [ Claude Desktop] ( https://claude.ai/download ) and interact with it right away by running:
138+
137139``` bash
138140uv run mcp install server.py
139141```
140142
141143Alternatively, you can test it with the MCP Inspector:
144+
142145``` bash
143146uv run mcp dev server.py
144147```
@@ -232,6 +235,7 @@ def get_settings() -> str:
232235 "debug": false
233236}"""
234237```
238+
235239_ Full example: [ examples/snippets/servers/basic_resource.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/basic_resource.py ) _
236240<!-- /snippet-source -->
237241
@@ -258,15 +262,17 @@ def get_weather(city: str, unit: str = "celsius") -> str:
258262 # This would normally call a weather API
259263 return f " Weather in { city} : 22degrees { unit[0 ].upper()} "
260264```
265+
261266_ Full example: [ examples/snippets/servers/basic_tool.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/basic_tool.py ) _
262267<!-- /snippet-source -->
263268
264269#### Structured Output
265270
266271Tools will return structured results by default, if their return type
267- annotation is compatible. Otherwise, they will return unstructured results.
272+ annotation is compatible. Otherwise, they will return unstructured results.
268273
269274Structured output supports these return types:
275+
270276- Pydantic models (BaseModel subclasses)
271277- TypedDicts
272278- Dataclasses and other classes with type hints
@@ -278,17 +284,17 @@ Classes without type hints cannot be serialized for structured output. Only
278284classes with properly annotated attributes will be converted to Pydantic models
279285for schema generation and validation.
280286
281- Structured results are automatically validated against the output schema
282- generated from the annotation. This ensures the tool returns well-typed,
287+ Structured results are automatically validated against the output schema
288+ generated from the annotation. This ensures the tool returns well-typed,
283289validated data that clients can easily process.
284290
285291** Note:** For backward compatibility, unstructured results are also
286- returned. Unstructured results are provided for backward compatibility
292+ returned. Unstructured results are provided for backward compatibility
287293with previous versions of the MCP specification, and are quirks-compatible
288294with previous versions of FastMCP in the current version of the SDK.
289295
290- ** Note:** In cases where a tool function's return type annotation
291- causes the tool to be classified as structured _ and this is undesirable_ ,
296+ ** Note:** In cases where a tool function's return type annotation
297+ causes the tool to be classified as structured _ and this is undesirable_ ,
292298the classification can be suppressed by passing ` structured_output=False `
293299to the ` @tool ` decorator.
294300
@@ -407,6 +413,7 @@ def debug_error(error: str) -> list[base.Message]:
407413 base.AssistantMessage(" I'll help debug that. What have you tried so far?" ),
408414 ]
409415```
416+
410417_ Full example: [ examples/snippets/servers/basic_prompt.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/basic_prompt.py ) _
411418<!-- /snippet-source -->
412419
@@ -456,6 +463,7 @@ async def long_running_task(task_name: str, ctx: Context, steps: int = 5) -> str
456463
457464 return f " Task ' { task_name} ' completed "
458465```
466+
459467_ Full example: [ examples/snippets/servers/tool_progress.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/tool_progress.py ) _
460468<!-- /snippet-source -->
461469
@@ -464,6 +472,7 @@ _Full example: [examples/snippets/servers/tool_progress.py](https://github.com/m
464472MCP supports providing completion suggestions for prompt arguments and resource template parameters. With the context parameter, servers can provide completions based on previously resolved values:
465473
466474Client usage:
475+
467476``` python
468477from mcp.client.session import ClientSession
469478from mcp.types import ResourceTemplateReference
@@ -542,11 +551,12 @@ async def handle_completion(
542551
543552 return None
544553```
554+
545555_ Full example: [ examples/snippets/servers/completion.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/completion.py ) _
546556<!-- /snippet-source -->
547557### Elicitation
548558
549- Request additional information from users during tool execution :
559+ Request additional information from users. This example shows an Elicitation during a Tool Call :
550560
551561<!-- snippet-source examples/snippets/servers/elicitation.py -->
552562``` python
@@ -592,10 +602,12 @@ async def book_table(
592602 # Date available
593603 return f " [SUCCESS] Booked for { date} at { time} "
594604```
605+
595606_ Full example: [ examples/snippets/servers/elicitation.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/elicitation.py ) _
596607<!-- /snippet-source -->
597608
598609The ` elicit() ` method returns an ` ElicitationResult ` with:
610+
599611- ` action ` : "accept", "decline", or "cancel"
600612- ` data ` : The validated response (only when accepted)
601613- ` validation_error ` : Any validation error message
@@ -631,6 +643,7 @@ async def generate_poem(topic: str, ctx: Context) -> str:
631643 return result.content.text
632644 return str (result.content)
633645```
646+
634647_ Full example: [ examples/snippets/servers/sampling.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/sampling.py ) _
635648<!-- /snippet-source -->
636649
@@ -659,6 +672,7 @@ async def process_data(data: str, ctx: Context) -> str:
659672
660673 return f " Processed: { data} "
661674```
675+
662676_ Full example: [ examples/snippets/servers/notifications.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/notifications.py ) _
663677<!-- /snippet-source -->
664678
@@ -697,6 +711,7 @@ mcp = FastMCP(
697711For a complete example with separate Authorization Server and Resource Server implementations, see [ ` examples/servers/simple-auth/ ` ] ( examples/servers/simple-auth/ ) .
698712
699713** Architecture:**
714+
700715- ** Authorization Server (AS)** : Handles OAuth flows, user authentication, and token issuance
701716- ** Resource Server (RS)** : Your MCP server that validates tokens and serves protected resources
702717- ** Client** : Discovers AS through RFC 9728, obtains tokens, and uses them with the MCP server
@@ -748,6 +763,7 @@ if __name__ == "__main__":
748763```
749764
750765Run it with:
766+
751767``` bash
752768python server.py
753769# or
@@ -827,10 +843,12 @@ app.mount("/math", math.mcp.streamable_http_app())
827843```
828844
829845For low level server with Streamable HTTP implementations, see:
846+
830847- Stateful server: [ ` examples/servers/simple-streamablehttp/ ` ] ( examples/servers/simple-streamablehttp/ )
831848- Stateless server: [ ` examples/servers/simple-streamablehttp-stateless/ ` ] ( examples/servers/simple-streamablehttp-stateless/ )
832849
833850The streamable HTTP transport supports:
851+
834852- Stateful and stateless operation modes
835853- Resumability with event stores
836854- JSON or SSE response formats
@@ -1003,6 +1021,7 @@ async def query_db(name: str, arguments: dict) -> list:
10031021```
10041022
10051023The lifespan API provides:
1024+
10061025- A way to initialize resources when the server starts and clean them up when it stops
10071026- Access to initialized resources through the request context in handlers
10081027- Type-safe context passing between lifespan and request handlers
@@ -1129,6 +1148,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> dict[str, Any]:
11291148```
11301149
11311150Tools can return data in three ways:
1151+
113211521 . ** Content only** : Return a list of content blocks (default behavior before spec revision 2025-06-18)
113311532 . ** Structured data only** : Return a dictionary that will be serialized to JSON (Introduced in spec revision 2025-06-18)
113411543 . ** Both** : Return a tuple of (content, structured_data) preferred option to use for backwards compatibility
@@ -1254,6 +1274,7 @@ async def display_resources(session: ClientSession):
12541274```
12551275
12561276The ` get_display_name() ` function implements the proper precedence rules for displaying names:
1277+
12571278- For tools: ` title ` > ` annotations.title ` > ` name `
12581279- For other objects: ` title ` > ` name `
12591280
@@ -1312,7 +1333,6 @@ async def main():
13121333
13131334For a complete working example, see [ ` examples/clients/simple-auth-client/ ` ] ( examples/clients/simple-auth-client/ ) .
13141335
1315-
13161336### MCP Primitives
13171337
13181338The MCP protocol defines three core primitives that servers can implement:
@@ -1327,13 +1347,13 @@ The MCP protocol defines three core primitives that servers can implement:
13271347
13281348MCP servers declare capabilities during initialization:
13291349
1330- | Capability | Feature Flag | Description |
1331- | -------------| ------------------------------| ------------------------------------|
1332- | ` prompts ` | ` listChanged ` | Prompt template management |
1333- | ` resources ` | ` subscribe ` <br />` listChanged ` | Resource exposure and updates |
1334- | ` tools ` | ` listChanged ` | Tool discovery and execution |
1335- | ` logging ` | - | Server logging configuration |
1336- | ` completion ` | - | Argument completion suggestions |
1350+ | Capability | Feature Flag | Description |
1351+ | -------------- | ------------------------------| ------------------------------------|
1352+ | ` prompts ` | ` listChanged ` | Prompt template management |
1353+ | ` resources ` | ` subscribe ` <br />` listChanged ` | Resource exposure and updates |
1354+ | ` tools ` | ` listChanged ` | Tool discovery and execution |
1355+ | ` logging ` | - | Server logging configuration |
1356+ | ` completions ` | - | Argument completion suggestions |
13371357
13381358## Documentation
13391359
0 commit comments