Add comprehensive documentation for lifespan support:
- Add usage examples for both Server and FastMPC classes
- Document startup/shutdown patterns
- Show context access in tools and handlers
- Clean up spacing in test files
Adds comprehensive tests for lifespan functionality:
- Tests for both low-level Server and FastMCP classes
- Coverage for startup, shutdown, and context access
- Verifies context passing to request handlers
This commit adds support for request cancellation and tracking of
in-flight requests in the MCP protocol implementation. The key
architectural changes are:
1. Request Lifecycle Management:
- Added _in_flight dictionary to BaseSession to track active requests
- Requests are tracked from receipt until completion/cancellation
- Added proper cleanup via on_complete callback
2. Cancellation Support:
- Added CancelledNotification handling in _receive_loop
- Implemented cancel() method in RequestResponder
- Uses anyio.CancelScope for robust cancellation
- Sends error response on cancellation
3. Request Context:
- Added request_ctx ContextVar for request context
- Ensures proper cleanup after request handling
- Maintains request state throughout lifecycle
4. Error Handling:
- Improved error propagation for cancelled requests
- Added proper cleanup of cancelled requests
- Maintains consistency of in-flight tracking
This change enables clients to cancel long-running requests and
servers to properly clean up resources when requests are cancelled.
Github-Issue:#88
Introduce ReadResourceContents type to properly handle MIME types in resource responses. Breaking change in FastMCP read_resource() return type.
Github-Issue:#152
The server was ignoring mime types set on resources, defaulting to text/plain
for strings and application/octet-stream for bytes. Now properly preserves
the specified mime type in both FastMCP and low-level server implementations.
Note that this is breaks backwards compatibility as it changes the return
values of read_resource() on FastMCP. It is BC compatible on lowlevel since
it only extends the callback.
Github-Issue: #152
Reported-by: eiseleMichael