- Move 'import inspect' to top of file
- Pre-compute whether middleware is async using inspect.iscoroutinefunction()
instead of checking on every message
- Add test for receive_middleware to fix coverage
Add a middleware pattern that allows transforming JSON-RPC messages before
sending and after receiving. This provides a clean way to extend protocol
messages (e.g., adding custom capabilities to initialize requests) without
needing to subclass or override session methods.
Middleware functions receive a JSONRPCMessage and return a (possibly
transformed) JSONRPCMessage. Both sync and async middleware are supported.
Usage example:
def add_capabilities(message: JSONRPCMessage) -> JSONRPCMessage:
if isinstance(message.root, JSONRPCRequest):
# Transform the message...
pass
return message
session = ClientSession(
read_stream, write_stream,
send_middleware=[add_capabilities],
)
Changes:
- Add MessageMiddleware type alias in mcp.shared.session
- Add send_middleware and receive_middleware parameters to BaseSession
- Apply middleware in send_request, send_notification, _send_response
- Apply middleware in _receive_loop after receiving messages
- Export MessageMiddleware, JSONRPCMessage, JSONRPCNotification from mcp
- Add tests for sync and async middleware
* refactor: improve typing with memory stream type aliases
Move memory stream type definitions to models.py and use them throughout
the codebase for better type safety and maintainability.
GitHub-Issue:#201
* refactor: move streams to ParsedMessage
* refactor: update test files to use ParsedMessage
Updates test files to work with the ParsedMessage stream type aliases
and fixes a line length issue in test_201_client_hangs_on_logging.py.
Github-Issue:#201
* refactor: rename ParsedMessage to MessageFrame for clarity
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: move MessageFrame class to types.py for better code organization
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix pyright
* refactor: update websocket client to use MessageFrame
Modified the websocket client to work with the new MessageFrame type,
preserving raw message text and properly extracting the root JSON-RPC
message when sending.
Github-Issue:#204
* fix: use NoneType instead of None for type parameters in MessageFrame
🤖 Generated with [Claude Code](https://claude.ai/code)
* refactor: rename root to message
* Close resources
* Close all resources
* Update pyproject.toml
* Close all resources
* Close all resources
* try now...
* try to ignore this
* try again
* try adding one more..
* try now
* try now
* revert ci changes