chore: add markdownlint on pre-commit hook and lint md files (#996)
Co-authored-by: Marcelo Trylesinski <marcelotryle@gmail.com>
This commit is contained in:
parent
f55831ee79
commit
6d092af6fd
1 changed files with 85 additions and 28 deletions
34
README.md
34
README.md
|
|
@ -95,6 +95,7 @@ If you haven't created a uv-managed project yet, create one:
|
|||
```
|
||||
|
||||
Alternatively, for projects using pip for dependencies:
|
||||
|
||||
```bash
|
||||
pip install "mcp[cli]"
|
||||
```
|
||||
|
|
@ -134,11 +135,13 @@ def get_greeting(name: str) -> str:
|
|||
```
|
||||
|
||||
You can install this server in [Claude Desktop](https://claude.ai/download) and interact with it right away by running:
|
||||
|
||||
```bash
|
||||
uv run mcp install server.py
|
||||
```
|
||||
|
||||
Alternatively, you can test it with the MCP Inspector:
|
||||
|
||||
```bash
|
||||
uv run mcp dev server.py
|
||||
```
|
||||
|
|
@ -232,6 +235,7 @@ def get_settings() -> str:
|
|||
"debug": false
|
||||
}"""
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/basic_resource.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/basic_resource.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
|
|
@ -258,15 +262,17 @@ def get_weather(city: str, unit: str = "celsius") -> str:
|
|||
# This would normally call a weather API
|
||||
return f"Weather in {city}: 22degrees{unit[0].upper()}"
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/basic_tool.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/basic_tool.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
#### Structured Output
|
||||
|
||||
Tools will return structured results by default, if their return type
|
||||
annotation is compatible. Otherwise, they will return unstructured results.
|
||||
annotation is compatible. Otherwise, they will return unstructured results.
|
||||
|
||||
Structured output supports these return types:
|
||||
|
||||
- Pydantic models (BaseModel subclasses)
|
||||
- TypedDicts
|
||||
- Dataclasses and other classes with type hints
|
||||
|
|
@ -278,17 +284,17 @@ Classes without type hints cannot be serialized for structured output. Only
|
|||
classes with properly annotated attributes will be converted to Pydantic models
|
||||
for schema generation and validation.
|
||||
|
||||
Structured results are automatically validated against the output schema
|
||||
generated from the annotation. This ensures the tool returns well-typed,
|
||||
Structured results are automatically validated against the output schema
|
||||
generated from the annotation. This ensures the tool returns well-typed,
|
||||
validated data that clients can easily process.
|
||||
|
||||
**Note:** For backward compatibility, unstructured results are also
|
||||
returned. Unstructured results are provided for backward compatibility
|
||||
returned. Unstructured results are provided for backward compatibility
|
||||
with previous versions of the MCP specification, and are quirks-compatible
|
||||
with previous versions of FastMCP in the current version of the SDK.
|
||||
|
||||
**Note:** In cases where a tool function's return type annotation
|
||||
causes the tool to be classified as structured _and this is undesirable_,
|
||||
**Note:** In cases where a tool function's return type annotation
|
||||
causes the tool to be classified as structured _and this is undesirable_,
|
||||
the classification can be suppressed by passing `structured_output=False`
|
||||
to the `@tool` decorator.
|
||||
|
||||
|
|
@ -407,6 +413,7 @@ def debug_error(error: str) -> list[base.Message]:
|
|||
base.AssistantMessage("I'll help debug that. What have you tried so far?"),
|
||||
]
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/basic_prompt.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/basic_prompt.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
|
|
@ -456,6 +463,7 @@ async def long_running_task(task_name: str, ctx: Context, steps: int = 5) -> str
|
|||
|
||||
return f"Task '{task_name}' completed"
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/tool_progress.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/tool_progress.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
|
|
@ -464,6 +472,7 @@ _Full example: [examples/snippets/servers/tool_progress.py](https://github.com/m
|
|||
MCP supports providing completion suggestions for prompt arguments and resource template parameters. With the context parameter, servers can provide completions based on previously resolved values:
|
||||
|
||||
Client usage:
|
||||
|
||||
```python
|
||||
from mcp.client.session import ClientSession
|
||||
from mcp.types import ResourceTemplateReference
|
||||
|
|
@ -542,6 +551,7 @@ async def handle_completion(
|
|||
|
||||
return None
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/completion.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/completion.py)_
|
||||
<!-- /snippet-source -->
|
||||
### Elicitation
|
||||
|
|
@ -592,10 +602,12 @@ async def book_table(
|
|||
# Date available
|
||||
return f"[SUCCESS] Booked for {date} at {time}"
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/elicitation.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/elicitation.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
The `elicit()` method returns an `ElicitationResult` with:
|
||||
|
||||
- `action`: "accept", "decline", or "cancel"
|
||||
- `data`: The validated response (only when accepted)
|
||||
- `validation_error`: Any validation error message
|
||||
|
|
@ -631,6 +643,7 @@ async def generate_poem(topic: str, ctx: Context) -> str:
|
|||
return result.content.text
|
||||
return str(result.content)
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/sampling.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/sampling.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
|
|
@ -659,6 +672,7 @@ async def process_data(data: str, ctx: Context) -> str:
|
|||
|
||||
return f"Processed: {data}"
|
||||
```
|
||||
|
||||
_Full example: [examples/snippets/servers/notifications.py](https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/notifications.py)_
|
||||
<!-- /snippet-source -->
|
||||
|
||||
|
|
@ -697,6 +711,7 @@ mcp = FastMCP(
|
|||
For a complete example with separate Authorization Server and Resource Server implementations, see [`examples/servers/simple-auth/`](examples/servers/simple-auth/).
|
||||
|
||||
**Architecture:**
|
||||
|
||||
- **Authorization Server (AS)**: Handles OAuth flows, user authentication, and token issuance
|
||||
- **Resource Server (RS)**: Your MCP server that validates tokens and serves protected resources
|
||||
- **Client**: Discovers AS through RFC 9728, obtains tokens, and uses them with the MCP server
|
||||
|
|
@ -748,6 +763,7 @@ if __name__ == "__main__":
|
|||
```
|
||||
|
||||
Run it with:
|
||||
|
||||
```bash
|
||||
python server.py
|
||||
# or
|
||||
|
|
@ -827,10 +843,12 @@ app.mount("/math", math.mcp.streamable_http_app())
|
|||
```
|
||||
|
||||
For low level server with Streamable HTTP implementations, see:
|
||||
|
||||
- Stateful server: [`examples/servers/simple-streamablehttp/`](examples/servers/simple-streamablehttp/)
|
||||
- Stateless server: [`examples/servers/simple-streamablehttp-stateless/`](examples/servers/simple-streamablehttp-stateless/)
|
||||
|
||||
The streamable HTTP transport supports:
|
||||
|
||||
- Stateful and stateless operation modes
|
||||
- Resumability with event stores
|
||||
- JSON or SSE response formats
|
||||
|
|
@ -1003,6 +1021,7 @@ async def query_db(name: str, arguments: dict) -> list:
|
|||
```
|
||||
|
||||
The lifespan API provides:
|
||||
|
||||
- A way to initialize resources when the server starts and clean them up when it stops
|
||||
- Access to initialized resources through the request context in handlers
|
||||
- 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]:
|
|||
```
|
||||
|
||||
Tools can return data in three ways:
|
||||
|
||||
1. **Content only**: Return a list of content blocks (default behavior before spec revision 2025-06-18)
|
||||
2. **Structured data only**: Return a dictionary that will be serialized to JSON (Introduced in spec revision 2025-06-18)
|
||||
3. **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):
|
|||
```
|
||||
|
||||
The `get_display_name()` function implements the proper precedence rules for displaying names:
|
||||
|
||||
- For tools: `title` > `annotations.title` > `name`
|
||||
- For other objects: `title` > `name`
|
||||
|
||||
|
|
@ -1312,7 +1333,6 @@ async def main():
|
|||
|
||||
For a complete working example, see [`examples/clients/simple-auth-client/`](examples/clients/simple-auth-client/).
|
||||
|
||||
|
||||
### MCP Primitives
|
||||
|
||||
The MCP protocol defines three core primitives that servers can implement:
|
||||
|
|
|
|||
Loading…
Reference in a new issue