From b42d5cd5fe6542d5f1a7d8d6141aa4e968f2d499 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Tue, 2 Jun 2026 18:06:12 +0200 Subject: [PATCH] Extract protocol types into a standalone mcp-types package Convert the repository into a uv workspace mirroring pydantic/httpx2. The root pyproject becomes a pure coordinator (package = false) and the two distributable packages live nested under src/// each with their own pyproject: - src/mcp/mcp/ -> mcp - src/mcp-types/mcp_types/ -> mcp-types (import mcp_types) The protocol types (_types.py, jsonrpc.py) move into mcp_types, which only depends on pydantic and typing-extensions. mcp depends on mcp-types via uv-dynamic-versioning, so installing mcp still pulls the types in. The mcp.types module path is removed; all imports now use mcp_types. The curated re-exports on the top-level mcp package are unchanged. --- README.v2.md | 32 +++-- docs/experimental/tasks-client.md | 10 +- docs/experimental/tasks-server.md | 14 +- docs/experimental/tasks.md | 6 +- docs/migration.md | 70 ++++++--- docs/testing.md | 2 +- .../mcp_simple_task_client/main.py | 2 +- .../main.py | 2 +- .../direct_call_tool_result_return.py | 2 +- .../mcp_everything_server/server.py | 2 +- .../mcp_simple_pagination/server.py | 2 +- .../simple-prompt/mcp_simple_prompt/server.py | 2 +- examples/servers/simple-resource/README.md | 2 +- .../mcp_simple_resource/server.py | 2 +- .../server.py | 2 +- .../mcp_simple_streamablehttp/event_store.py | 2 +- .../mcp_simple_streamablehttp/server.py | 2 +- .../mcp_simple_task_interactive/server.py | 2 +- .../simple-task/mcp_simple_task/server.py | 2 +- .../simple-tool/mcp_simple_tool/server.py | 2 +- .../mcp_sse_polling_demo/event_store.py | 2 +- .../mcp_sse_polling_demo/server.py | 2 +- .../__main__.py | 3 +- .../snippets/clients/completion_client.py | 3 +- .../snippets/clients/pagination_client.py | 3 +- .../snippets/clients/parsing_tool_results.py | 4 +- examples/snippets/clients/stdio_client.py | 4 +- .../clients/url_elicitation_client.py | 6 +- examples/snippets/servers/completion.py | 5 +- .../servers/direct_call_tool_result.py | 2 +- examples/snippets/servers/elicitation.py | 2 +- examples/snippets/servers/lowlevel/basic.py | 3 +- .../lowlevel/direct_call_tool_result.py | 3 +- .../snippets/servers/lowlevel/lifespan.py | 3 +- .../servers/lowlevel/structured_output.py | 3 +- .../snippets/servers/pagination_example.py | 3 +- examples/snippets/servers/sampling.py | 3 +- pyproject.toml | 88 ++---------- src/mcp-types/README.md | 11 ++ .../types => mcp-types/mcp_types}/__init__.py | 9 +- .../types => mcp-types/mcp_types}/_types.py | 2 +- .../types => mcp-types/mcp_types}/jsonrpc.py | 0 src/{mcp => mcp-types/mcp_types}/py.typed | 0 src/mcp-types/pyproject.toml | 55 +++++++ src/mcp/{ => mcp}/__init__.py | 19 +-- src/mcp/{ => mcp}/cli/__init__.py | 0 src/mcp/{ => mcp}/cli/claude.py | 0 src/mcp/{ => mcp}/cli/cli.py | 0 src/mcp/{ => mcp}/client/__init__.py | 0 src/mcp/{ => mcp}/client/__main__.py | 2 +- src/mcp/{ => mcp}/client/_memory.py | 0 src/mcp/{ => mcp}/client/_transport.py | 0 src/mcp/{ => mcp}/client/auth/__init__.py | 0 src/mcp/{ => mcp}/client/auth/exceptions.py | 0 .../client/auth/extensions/__init__.py | 0 .../auth/extensions/client_credentials.py | 0 src/mcp/{ => mcp}/client/auth/oauth2.py | 0 src/mcp/{ => mcp}/client/auth/utils.py | 2 +- src/mcp/{ => mcp}/client/client.py | 17 +-- src/mcp/{ => mcp}/client/context.py | 0 .../{ => mcp}/client/experimental/__init__.py | 0 .../client/experimental/task_handlers.py | 2 +- .../{ => mcp}/client/experimental/tasks.py | 5 +- src/mcp/{ => mcp}/client/session.py | 4 +- src/mcp/{ => mcp}/client/session_group.py | 2 +- src/mcp/{ => mcp}/client/sse.py | 2 +- src/mcp/{ => mcp}/client/stdio.py | 2 +- src/mcp/{ => mcp}/client/streamable_http.py | 14 +- src/mcp/{ => mcp}/client/websocket.py | 2 +- src/mcp/{ => mcp}/os/__init__.py | 0 src/mcp/{ => mcp}/os/posix/__init__.py | 0 src/mcp/{ => mcp}/os/posix/utilities.py | 0 src/mcp/{ => mcp}/os/win32/__init__.py | 0 src/mcp/{ => mcp}/os/win32/utilities.py | 0 src/mcp/{shared/__init__.py => mcp/py.typed} | 0 src/mcp/{ => mcp}/server/__init__.py | 0 src/mcp/{ => mcp}/server/__main__.py | 2 +- src/mcp/{ => mcp}/server/auth/__init__.py | 0 src/mcp/{ => mcp}/server/auth/errors.py | 0 .../server/auth/handlers/__init__.py | 0 .../server/auth/handlers/authorize.py | 0 .../server/auth/handlers/metadata.py | 0 .../server/auth/handlers/register.py | 0 .../{ => mcp}/server/auth/handlers/revoke.py | 0 .../{ => mcp}/server/auth/handlers/token.py | 0 .../{ => mcp}/server/auth/json_response.py | 0 .../server/auth/middleware/__init__.py | 0 .../server/auth/middleware/auth_context.py | 0 .../server/auth/middleware/bearer_auth.py | 0 .../server/auth/middleware/client_auth.py | 0 src/mcp/{ => mcp}/server/auth/provider.py | 0 src/mcp/{ => mcp}/server/auth/routes.py | 0 src/mcp/{ => mcp}/server/auth/settings.py | 0 src/mcp/{ => mcp}/server/context.py | 0 src/mcp/{ => mcp}/server/elicitation.py | 2 +- .../{ => mcp}/server/experimental/__init__.py | 0 .../server/experimental/request_context.py | 13 +- .../server/experimental/session_features.py | 3 +- .../server/experimental/task_context.py | 28 ++-- .../experimental/task_result_handler.py | 16 +-- .../server/experimental/task_support.py | 0 src/mcp/{ => mcp}/server/lowlevel/__init__.py | 0 .../{ => mcp}/server/lowlevel/experimental.py | 20 +-- .../{ => mcp}/server/lowlevel/helper_types.py | 0 src/mcp/{ => mcp}/server/lowlevel/server.py | 2 +- .../{ => mcp}/server/mcpserver/__init__.py | 2 +- src/mcp/{ => mcp}/server/mcpserver/context.py | 2 +- .../{ => mcp}/server/mcpserver/exceptions.py | 0 .../server/mcpserver/prompts/__init__.py | 0 .../server/mcpserver/prompts/base.py | 2 +- .../server/mcpserver/prompts/manager.py | 0 .../server/mcpserver/resources/__init__.py | 0 .../server/mcpserver/resources/base.py | 3 +- .../mcpserver/resources/resource_manager.py | 2 +- .../server/mcpserver/resources/templates.py | 2 +- .../server/mcpserver/resources/types.py | 2 +- src/mcp/{ => mcp}/server/mcpserver/server.py | 56 ++++---- .../server/mcpserver/tools/__init__.py | 0 .../{ => mcp}/server/mcpserver/tools/base.py | 2 +- .../server/mcpserver/tools/tool_manager.py | 3 +- .../server/mcpserver/utilities/__init__.py | 0 .../mcpserver/utilities/context_injection.py | 0 .../mcpserver/utilities/func_metadata.py | 2 +- .../server/mcpserver/utilities/logging.py | 0 .../server/mcpserver/utilities/types.py | 2 +- src/mcp/{ => mcp}/server/models.py | 3 +- src/mcp/{ => mcp}/server/session.py | 2 +- src/mcp/{ => mcp}/server/sse.py | 2 +- src/mcp/{ => mcp}/server/stdio.py | 2 +- src/mcp/{ => mcp}/server/streamable_http.py | 24 ++-- .../server/streamable_http_manager.py | 2 +- .../{ => mcp}/server/transport_security.py | 0 src/mcp/{ => mcp}/server/validation.py | 3 +- src/mcp/{ => mcp}/server/websocket.py | 2 +- src/mcp/mcp/shared/__init__.py | 0 .../{ => mcp}/shared/_callable_inspection.py | 0 src/mcp/{ => mcp}/shared/_context.py | 2 +- src/mcp/{ => mcp}/shared/_context_streams.py | 0 src/mcp/{ => mcp}/shared/_httpx_utils.py | 0 src/mcp/{ => mcp}/shared/_otel.py | 0 src/mcp/{ => mcp}/shared/_stream_protocols.py | 0 src/mcp/{ => mcp}/shared/auth.py | 0 src/mcp/{ => mcp}/shared/auth_utils.py | 0 src/mcp/{ => mcp}/shared/exceptions.py | 2 +- .../{ => mcp}/shared/experimental/__init__.py | 0 .../shared/experimental/tasks/__init__.py | 0 .../shared/experimental/tasks/capabilities.py | 3 +- .../shared/experimental/tasks/context.py | 3 +- .../shared/experimental/tasks/helpers.py | 9 +- .../tasks/in_memory_task_store.py | 2 +- .../experimental/tasks/message_queue.py | 2 +- .../shared/experimental/tasks/polling.py | 2 +- .../shared/experimental/tasks/resolver.py | 0 .../shared/experimental/tasks/store.py | 2 +- src/mcp/{ => mcp}/shared/memory.py | 0 src/mcp/{ => mcp}/shared/message.py | 2 +- src/mcp/{ => mcp}/shared/metadata_utils.py | 2 +- src/mcp/{ => mcp}/shared/response_router.py | 2 +- src/mcp/{ => mcp}/shared/session.py | 20 +-- .../{ => mcp}/shared/tool_name_validation.py | 0 src/mcp/{ => mcp}/shared/version.py | 2 +- src/mcp/pyproject.toml | 88 ++++++++++++ tests/client/conftest.py | 2 +- tests/client/test_client.py | 15 +- tests/client/test_http_unicode.py | 4 +- tests/client/test_list_methods_cursor.py | 5 +- tests/client/test_list_roots_callback.py | 2 +- tests/client/test_logging_callback.py | 11 +- tests/client/test_notification_response.py | 5 +- tests/client/test_output_schema_validation.py | 8 +- tests/client/test_resource_cleanup.py | 2 +- tests/client/test_sampling_callback.py | 12 +- tests/client/test_session.py | 16 +-- tests/client/test_session_group.py | 2 +- tests/client/test_stdio.py | 2 +- tests/client/transports/test_memory.py | 5 +- .../tasks/client/test_capabilities.py | 15 +- .../tasks/client/test_handlers.py | 18 +-- .../tasks/client/test_poll_task.py | 2 +- tests/experimental/tasks/client/test_tasks.py | 12 +- .../experimental/tasks/server/test_context.py | 2 +- .../tasks/server/test_integration.py | 12 +- .../tasks/server/test_run_task_flow.py | 20 +-- .../experimental/tasks/server/test_server.py | 24 ++-- .../tasks/server/test_server_task_context.py | 14 +- tests/experimental/tasks/server/test_store.py | 2 +- .../tasks/server/test_task_result_handler.py | 16 +-- tests/experimental/tasks/test_capabilities.py | 18 +-- .../tasks/test_elicitation_scenarios.py | 22 +-- .../experimental/tasks/test_message_queue.py | 2 +- .../tasks/test_request_context.py | 8 +- .../tasks/test_spec_compliance.py | 10 +- tests/interaction/README.md | 4 +- tests/interaction/_connect.py | 20 +-- tests/interaction/_helpers.py | 2 +- .../interaction/auth/test_authorize_token.py | 4 +- tests/interaction/auth/test_bearer.py | 2 +- tests/interaction/auth/test_discovery.py | 4 +- tests/interaction/auth/test_flow.py | 4 +- tests/interaction/auth/test_lifecycle.py | 5 +- .../interaction/lowlevel/test_cancellation.py | 15 +- tests/interaction/lowlevel/test_completion.py | 9 +- .../interaction/lowlevel/test_elicitation.py | 15 +- tests/interaction/lowlevel/test_flows.py | 13 +- tests/interaction/lowlevel/test_initialize.py | 17 +-- .../interaction/lowlevel/test_list_changed.py | 8 +- tests/interaction/lowlevel/test_logging.py | 4 +- tests/interaction/lowlevel/test_meta.py | 4 +- tests/interaction/lowlevel/test_pagination.py | 9 +- tests/interaction/lowlevel/test_ping.py | 4 +- tests/interaction/lowlevel/test_progress.py | 4 +- tests/interaction/lowlevel/test_prompts.py | 9 +- tests/interaction/lowlevel/test_resources.py | 9 +- tests/interaction/lowlevel/test_roots.py | 5 +- tests/interaction/lowlevel/test_sampling.py | 11 +- tests/interaction/lowlevel/test_timeouts.py | 5 +- tests/interaction/lowlevel/test_tools.py | 9 +- tests/interaction/lowlevel/test_wire.py | 19 +-- .../interaction/mcpserver/test_completion.py | 6 +- tests/interaction/mcpserver/test_context.py | 14 +- tests/interaction/mcpserver/test_prompts.py | 8 +- tests/interaction/mcpserver/test_resources.py | 8 +- tests/interaction/mcpserver/test_tools.py | 14 +- tests/interaction/transports/_event_store.py | 2 +- tests/interaction/transports/_stdio_server.py | 8 +- .../transports/test_client_transport_http.py | 5 +- tests/interaction/transports/test_flows.py | 2 +- .../transports/test_hosting_http.py | 8 +- .../transports/test_hosting_resume.py | 12 +- .../transports/test_hosting_session.py | 2 +- tests/interaction/transports/test_sse.py | 2 +- tests/interaction/transports/test_stdio.py | 14 +- .../transports/test_streamable_http.py | 12 +- tests/issues/test_1338_icons_and_metadata.py | 2 +- tests/issues/test_141_resource_templates.py | 8 +- tests/issues/test_152_resource_mime_type.py | 11 +- .../test_1574_resource_uri_validation.py | 9 +- tests/issues/test_192_request_id.py | 10 +- tests/issues/test_342_base64_encoding.py | 2 +- tests/issues/test_88_random_error.py | 4 +- tests/issues/test_malformed_input.py | 2 +- tests/server/lowlevel/test_server_listing.py | 8 +- .../server/lowlevel/test_server_pagination.py | 8 +- tests/server/mcpserver/prompts/test_base.py | 2 +- .../server/mcpserver/prompts/test_manager.py | 2 +- .../resources/test_resource_template.py | 2 +- .../mcpserver/resources/test_resources.py | 2 +- tests/server/mcpserver/test_elicitation.py | 5 +- tests/server/mcpserver/test_func_metadata.py | 2 +- tests/server/mcpserver/test_integration.py | 36 ++--- tests/server/mcpserver/test_server.py | 30 ++-- tests/server/mcpserver/test_title.py | 2 +- tests/server/mcpserver/test_tool_manager.py | 2 +- .../server/mcpserver/test_url_elicitation.py | 5 +- .../test_url_elicitation_error_throw.py | 3 +- tests/server/test_cancel_handling.py | 12 +- tests/server/test_completion_with_context.py | 8 +- tests/server/test_lifespan.py | 16 +-- .../test_lowlevel_exception_handling.py | 2 +- .../server/test_lowlevel_tool_annotations.py | 2 +- tests/server/test_read_resource.py | 8 +- tests/server/test_session.py | 18 +-- tests/server/test_session_race_condition.py | 4 +- tests/server/test_sse_security.py | 2 +- tests/server/test_stateless_mode.py | 4 +- tests/server/test_stdio.py | 2 +- tests/server/test_streamable_http_manager.py | 2 +- tests/server/test_streamable_http_security.py | 2 +- tests/server/test_validation.py | 16 +-- tests/shared/test_exceptions.py | 2 +- tests/shared/test_otel.py | 2 +- tests/shared/test_progress_notifications.py | 3 +- tests/shared/test_session.py | 19 +-- tests/shared/test_sse.py | 28 ++-- tests/shared/test_streamable_http.py | 29 ++-- tests/shared/test_ws.py | 2 +- tests/test_examples.py | 2 +- tests/test_types.py | 3 +- uv.lock | 136 ++++++++---------- 279 files changed, 1033 insertions(+), 870 deletions(-) create mode 100644 src/mcp-types/README.md rename src/{mcp/types => mcp-types/mcp_types}/__init__.py (97%) rename src/{mcp/types => mcp-types/mcp_types}/_types.py (99%) rename src/{mcp/types => mcp-types/mcp_types}/jsonrpc.py (100%) rename src/{mcp => mcp-types/mcp_types}/py.typed (100%) create mode 100644 src/mcp-types/pyproject.toml rename src/mcp/{ => mcp}/__init__.py (97%) rename src/mcp/{ => mcp}/cli/__init__.py (100%) rename src/mcp/{ => mcp}/cli/claude.py (100%) rename src/mcp/{ => mcp}/cli/cli.py (100%) rename src/mcp/{ => mcp}/client/__init__.py (100%) rename src/mcp/{ => mcp}/client/__main__.py (98%) rename src/mcp/{ => mcp}/client/_memory.py (100%) rename src/mcp/{ => mcp}/client/_transport.py (100%) rename src/mcp/{ => mcp}/client/auth/__init__.py (100%) rename src/mcp/{ => mcp}/client/auth/exceptions.py (100%) rename src/mcp/{ => mcp}/client/auth/extensions/__init__.py (100%) rename src/mcp/{ => mcp}/client/auth/extensions/client_credentials.py (100%) rename src/mcp/{ => mcp}/client/auth/oauth2.py (100%) rename src/mcp/{ => mcp}/client/auth/utils.py (99%) rename src/mcp/{ => mcp}/client/client.py (99%) rename src/mcp/{ => mcp}/client/context.py (100%) rename src/mcp/{ => mcp}/client/experimental/__init__.py (100%) rename src/mcp/{ => mcp}/client/experimental/task_handlers.py (99%) rename src/mcp/{ => mcp}/client/experimental/tasks.py (98%) rename src/mcp/{ => mcp}/client/session.py (99%) rename src/mcp/{ => mcp}/client/session_group.py (99%) rename src/mcp/{ => mcp}/client/sse.py (99%) rename src/mcp/{ => mcp}/client/stdio.py (99%) rename src/mcp/{ => mcp}/client/streamable_http.py (99%) rename src/mcp/{ => mcp}/client/websocket.py (99%) rename src/mcp/{ => mcp}/os/__init__.py (100%) rename src/mcp/{ => mcp}/os/posix/__init__.py (100%) rename src/mcp/{ => mcp}/os/posix/utilities.py (100%) rename src/mcp/{ => mcp}/os/win32/__init__.py (100%) rename src/mcp/{ => mcp}/os/win32/utilities.py (100%) rename src/mcp/{shared/__init__.py => mcp/py.typed} (100%) rename src/mcp/{ => mcp}/server/__init__.py (100%) rename src/mcp/{ => mcp}/server/__main__.py (96%) rename src/mcp/{ => mcp}/server/auth/__init__.py (100%) rename src/mcp/{ => mcp}/server/auth/errors.py (100%) rename src/mcp/{ => mcp}/server/auth/handlers/__init__.py (100%) rename src/mcp/{ => mcp}/server/auth/handlers/authorize.py (100%) rename src/mcp/{ => mcp}/server/auth/handlers/metadata.py (100%) rename src/mcp/{ => mcp}/server/auth/handlers/register.py (100%) rename src/mcp/{ => mcp}/server/auth/handlers/revoke.py (100%) rename src/mcp/{ => mcp}/server/auth/handlers/token.py (100%) rename src/mcp/{ => mcp}/server/auth/json_response.py (100%) rename src/mcp/{ => mcp}/server/auth/middleware/__init__.py (100%) rename src/mcp/{ => mcp}/server/auth/middleware/auth_context.py (100%) rename src/mcp/{ => mcp}/server/auth/middleware/bearer_auth.py (100%) rename src/mcp/{ => mcp}/server/auth/middleware/client_auth.py (100%) rename src/mcp/{ => mcp}/server/auth/provider.py (100%) rename src/mcp/{ => mcp}/server/auth/routes.py (100%) rename src/mcp/{ => mcp}/server/auth/settings.py (100%) rename src/mcp/{ => mcp}/server/context.py (100%) rename src/mcp/{ => mcp}/server/elicitation.py (99%) rename src/mcp/{ => mcp}/server/experimental/__init__.py (100%) rename src/mcp/{ => mcp}/server/experimental/request_context.py (99%) rename src/mcp/{ => mcp}/server/experimental/session_features.py (99%) rename src/mcp/{ => mcp}/server/experimental/task_context.py (99%) rename src/mcp/{ => mcp}/server/experimental/task_result_handler.py (99%) rename src/mcp/{ => mcp}/server/experimental/task_support.py (100%) rename src/mcp/{ => mcp}/server/lowlevel/__init__.py (100%) rename src/mcp/{ => mcp}/server/lowlevel/experimental.py (99%) rename src/mcp/{ => mcp}/server/lowlevel/helper_types.py (100%) rename src/mcp/{ => mcp}/server/lowlevel/server.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/__init__.py (89%) rename src/mcp/{ => mcp}/server/mcpserver/context.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/exceptions.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/prompts/__init__.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/prompts/base.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/prompts/manager.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/resources/__init__.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/resources/base.py (97%) rename src/mcp/{ => mcp}/server/mcpserver/resources/resource_manager.py (98%) rename src/mcp/{ => mcp}/server/mcpserver/resources/templates.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/resources/types.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/server.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/tools/__init__.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/tools/base.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/tools/tool_manager.py (98%) rename src/mcp/{ => mcp}/server/mcpserver/utilities/__init__.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/utilities/context_injection.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/utilities/func_metadata.py (99%) rename src/mcp/{ => mcp}/server/mcpserver/utilities/logging.py (100%) rename src/mcp/{ => mcp}/server/mcpserver/utilities/types.py (98%) rename src/mcp/{ => mcp}/server/models.py (89%) rename src/mcp/{ => mcp}/server/session.py (99%) rename src/mcp/{ => mcp}/server/sse.py (99%) rename src/mcp/{ => mcp}/server/stdio.py (99%) rename src/mcp/{ => mcp}/server/streamable_http.py (99%) rename src/mcp/{ => mcp}/server/streamable_http_manager.py (99%) rename src/mcp/{ => mcp}/server/transport_security.py (100%) rename src/mcp/{ => mcp}/server/validation.py (98%) rename src/mcp/{ => mcp}/server/websocket.py (98%) create mode 100644 src/mcp/mcp/shared/__init__.py rename src/mcp/{ => mcp}/shared/_callable_inspection.py (100%) rename src/mcp/{ => mcp}/shared/_context.py (92%) rename src/mcp/{ => mcp}/shared/_context_streams.py (100%) rename src/mcp/{ => mcp}/shared/_httpx_utils.py (100%) rename src/mcp/{ => mcp}/shared/_otel.py (100%) rename src/mcp/{ => mcp}/shared/_stream_protocols.py (100%) rename src/mcp/{ => mcp}/shared/auth.py (100%) rename src/mcp/{ => mcp}/shared/auth_utils.py (100%) rename src/mcp/{ => mcp}/shared/exceptions.py (98%) rename src/mcp/{ => mcp}/shared/experimental/__init__.py (100%) rename src/mcp/{ => mcp}/shared/experimental/tasks/__init__.py (100%) rename src/mcp/{ => mcp}/shared/experimental/tasks/capabilities.py (98%) rename src/mcp/{ => mcp}/shared/experimental/tasks/context.py (97%) rename src/mcp/{ => mcp}/shared/experimental/tasks/helpers.py (99%) rename src/mcp/{ => mcp}/shared/experimental/tasks/in_memory_task_store.py (99%) rename src/mcp/{ => mcp}/shared/experimental/tasks/message_queue.py (99%) rename src/mcp/{ => mcp}/shared/experimental/tasks/polling.py (97%) rename src/mcp/{ => mcp}/shared/experimental/tasks/resolver.py (100%) rename src/mcp/{ => mcp}/shared/experimental/tasks/store.py (98%) rename src/mcp/{ => mcp}/shared/memory.py (100%) rename src/mcp/{ => mcp}/shared/message.py (97%) rename src/mcp/{ => mcp}/shared/metadata_utils.py (96%) rename src/mcp/{ => mcp}/shared/response_router.py (97%) rename src/mcp/{ => mcp}/shared/session.py (99%) rename src/mcp/{ => mcp}/shared/tool_name_validation.py (100%) rename src/mcp/{ => mcp}/shared/version.py (70%) create mode 100644 src/mcp/pyproject.toml diff --git a/README.v2.md b/README.v2.md index d0851c04e5..d176333570 100644 --- a/README.v2.md +++ b/README.v2.md @@ -412,10 +412,10 @@ For full control over tool responses including the `_meta` field (for passing da from typing import Annotated +from mcp_types import CallToolResult, TextContent from pydantic import BaseModel from mcp.server.mcpserver import MCPServer -from mcp.types import CallToolResult, TextContent mcp = MCPServer("CallToolResult Example") @@ -732,9 +732,10 @@ uv run completion-client import asyncio import os +from mcp_types import PromptReference, ResourceTemplateReference + from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client -from mcp.types import PromptReference, ResourceTemplateReference # Create server parameters for stdio connection server_params = StdioServerParameters( @@ -821,11 +822,11 @@ like OAuth flows, credential collection, or payment processing. import uuid +from mcp_types import ElicitRequestURLParams from pydantic import BaseModel, Field from mcp.server.mcpserver import Context, MCPServer from mcp.shared.exceptions import UrlElicitationRequiredError -from mcp.types import ElicitRequestURLParams mcp = MCPServer(name="Elicitation Example") @@ -929,8 +930,9 @@ Tools can interact with LLMs through sampling (generating text): ```python +from mcp_types import SamplingMessage, TextContent + from mcp.server.mcpserver import Context, MCPServer -from mcp.types import SamplingMessage, TextContent mcp = MCPServer(name="Sampling Example") @@ -1639,8 +1641,9 @@ from collections.abc import AsyncIterator from contextlib import asynccontextmanager from typing import TypedDict +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext @@ -1751,8 +1754,9 @@ uv run examples/snippets/servers/lowlevel/basic.py import asyncio +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext @@ -1828,8 +1832,9 @@ uv run examples/snippets/servers/lowlevel/structured_output.py import asyncio import json +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext @@ -1920,8 +1925,9 @@ uv run examples/snippets/servers/lowlevel/direct_call_tool_result.py import asyncio +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext @@ -1991,7 +1997,8 @@ For servers that need to handle large datasets, the low-level server provides pa ```python """Example of implementing pagination with the low-level MCP server.""" -from mcp import types +import mcp_types as types + from mcp.server import Server, ServerRequestContext # Sample data to paginate @@ -2037,9 +2044,10 @@ _Full example: [examples/snippets/servers/pagination_example.py](https://github. import asyncio +from mcp_types import PaginatedRequestParams, Resource + from mcp.client.session import ClientSession from mcp.client.stdio import StdioServerParameters, stdio_client -from mcp.types import PaginatedRequestParams, Resource async def list_all_resources() -> None: @@ -2099,7 +2107,9 @@ uv run client import asyncio import os -from mcp import ClientSession, StdioServerParameters, types +import mcp_types as types + +from mcp import ClientSession, StdioServerParameters from mcp.client.context import ClientRequestContext from mcp.client.stdio import stdio_client diff --git a/docs/experimental/tasks-client.md b/docs/experimental/tasks-client.md index 0374ed86b5..0b057b2d9a 100644 --- a/docs/experimental/tasks-client.md +++ b/docs/experimental/tasks-client.md @@ -12,7 +12,7 @@ Call a tool as a task and poll for the result: ```python from mcp.client.session import ClientSession -from mcp.types import CallToolResult +from mcp_types import CallToolResult async with ClientSession(read, write) as session: await session.initialize() @@ -96,7 +96,7 @@ The elicitation callback (set during session creation) handles the actual user i To handle elicitation requests from the server, provide a callback when creating the session: ```python -from mcp.types import ElicitRequestParams, ElicitResult +from mcp_types import ElicitRequestParams, ElicitResult async def handle_elicitation(context, params: ElicitRequestParams) -> ElicitResult: # Display the message to the user @@ -125,7 +125,7 @@ async with ClientSession( Similarly, handle sampling requests with a callback: ```python -from mcp.types import CreateMessageRequestParams, CreateMessageResult, TextContent +from mcp_types import CreateMessageRequestParams, CreateMessageResult, TextContent async def handle_sampling(context, params: CreateMessageRequestParams) -> CreateMessageResult: # In a real implementation, call your LLM here @@ -207,7 +207,7 @@ Register task handlers to declare what task-augmented requests your client accep ```python from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers -from mcp.types import ( +from mcp_types import ( CreateTaskResult, GetTaskResult, GetTaskPayloadResult, TaskMetadata, ElicitRequestParams, ) @@ -283,7 +283,7 @@ A client that handles all task scenarios: import anyio from mcp.client.session import ClientSession from mcp.client.stdio import stdio_client -from mcp.types import CallToolResult, ElicitRequestParams, ElicitResult +from mcp_types import CallToolResult, ElicitRequestParams, ElicitResult async def elicitation_callback(context, params: ElicitRequestParams) -> ElicitResult: diff --git a/docs/experimental/tasks-server.md b/docs/experimental/tasks-server.md index b350ee3bb6..7c11bb33ad 100644 --- a/docs/experimental/tasks-server.md +++ b/docs/experimental/tasks-server.md @@ -13,7 +13,7 @@ The simplest way to add task support: ```python from mcp.server import Server from mcp.server.experimental.task_context import ServerTaskContext -from mcp.types import CallToolResult, CreateTaskResult, TextContent, Tool, ToolExecution, TASK_REQUIRED +from mcp_types import CallToolResult, CreateTaskResult, TextContent, Tool, ToolExecution, TASK_REQUIRED server = Server("my-server") server.experimental.enable_tasks() # Registers all task handlers automatically @@ -58,7 +58,7 @@ That's it. `enable_tasks()` automatically: Tools declare task support via the `execution.taskSupport` field: ```python -from mcp.types import Tool, ToolExecution, TASK_REQUIRED, TASK_OPTIONAL, TASK_FORBIDDEN +from mcp_types import Tool, ToolExecution, TASK_REQUIRED, TASK_OPTIONAL, TASK_FORBIDDEN Tool( name="my_tool", @@ -199,7 +199,7 @@ async def work(task: ServerTaskContext) -> CallToolResult: Tasks can request LLM completions from the client: ```python -from mcp.types import SamplingMessage, TextContent +from mcp_types import SamplingMessage, TextContent async def work(task: ServerTaskContext) -> CallToolResult: await task.update_status("Generating response...") @@ -256,7 +256,7 @@ For production, implement `TaskStore` with persistent storage: ```python from mcp.shared.experimental.tasks.store import TaskStore -from mcp.types import Task, TaskMetadata, Result +from mcp_types import Task, TaskMetadata, Result class RedisTaskStore(TaskStore): def __init__(self, redis_client): @@ -299,7 +299,7 @@ A server with multiple task-supporting tools: ```python from mcp.server import Server from mcp.server.experimental.task_context import ServerTaskContext -from mcp.types import ( +from mcp_types import ( CallToolResult, CreateTaskResult, TextContent, Tool, ToolExecution, SamplingMessage, TASK_REQUIRED, ) @@ -412,7 +412,7 @@ import uvicorn from mcp.server import Server from mcp.server.experimental.task_context import ServerTaskContext -from mcp.types import ( +from mcp_types import ( CallToolResult, CreateTaskResult, TextContent, Tool, ToolExecution, TASK_REQUIRED, ) @@ -468,7 +468,7 @@ Test task functionality with the SDK's testing utilities: import pytest import anyio from mcp.client.session import ClientSession -from mcp.types import CallToolResult +from mcp_types import CallToolResult @pytest.mark.anyio diff --git a/docs/experimental/tasks.md b/docs/experimental/tasks.md index 2d4d06a025..573fd1b10e 100644 --- a/docs/experimental/tasks.md +++ b/docs/experimental/tasks.md @@ -102,7 +102,7 @@ Server Client When augmenting a request with task execution, include `TaskMetadata`: ```python -from mcp.types import TaskMetadata +from mcp_types import TaskMetadata task = TaskMetadata(ttl=60000) # TTL in milliseconds ``` @@ -143,7 +143,7 @@ The SDK manages these automatically when you enable task support. ```python from mcp.server import Server from mcp.server.experimental.task_context import ServerTaskContext -from mcp.types import CallToolResult, TextContent, TASK_REQUIRED +from mcp_types import CallToolResult, TextContent, TASK_REQUIRED server = Server("my-server") server.experimental.enable_tasks() # One-line setup @@ -165,7 +165,7 @@ async def handle_tool(name: str, arguments: dict): ```python from mcp.client.session import ClientSession -from mcp.types import CallToolResult +from mcp_types import CallToolResult async with ClientSession(read, write) as session: await session.initialize() diff --git a/docs/migration.md b/docs/migration.md index 8b70885e8d..f5925be97e 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -8,6 +8,34 @@ Version 2 of the MCP Python SDK introduces several breaking changes to improve t ## Breaking Changes +### Protocol types moved to the `mcp-types` package + +The protocol types previously imported from `mcp.types` now live in a standalone +[`mcp-types`](https://pypi.org/project/mcp-types/) package, imported as `mcp_types`. The +`mcp` package depends on it, so installing `mcp` continues to pull the types in. Update +imports from the `mcp.types` module path to `mcp_types`: + +**Before (v1):** + +```python +from mcp.types import Tool, CallToolRequest +from mcp import types + +types.Tool(...) +``` + +**After (v2):** + +```python +from mcp_types import Tool, CallToolRequest +import mcp_types as types + +types.Tool(...) +``` + +The curated re-exports on the top-level `mcp` package (e.g. `from mcp import Tool`) are +unchanged. + ### `streamablehttp_client` removed The deprecated `streamablehttp_client` function has been removed. Use `streamable_http_client` instead. @@ -107,7 +135,7 @@ Note: `sse_client` retains its `headers`, `timeout`, `sse_read_timeout`, and `au ### Removed type aliases and classes -The following deprecated type aliases and classes have been removed from `mcp.types`: +The following deprecated type aliases and classes have been removed from `mcp_types`: | Removed | Replacement | |---------|-------------| @@ -121,19 +149,19 @@ The following deprecated type aliases and classes have been removed from `mcp.ty **Before (v1):** ```python -from mcp.types import Content, ResourceReference, Cursor +from mcp_types import Content, ResourceReference, Cursor ``` **After (v2):** ```python -from mcp.types import ContentBlock, ResourceTemplateReference +from mcp_types import ContentBlock, ResourceTemplateReference # Use `str` instead of `Cursor` for pagination cursors ``` ### Field names changed from camelCase to snake_case -All Pydantic model fields in `mcp.types` now use snake_case names for Python attribute access. The JSON wire format is unchanged — serialization still uses camelCase via Pydantic aliases. +All Pydantic model fields in `mcp_types` now use snake_case names for Python attribute access. The JSON wire format is unchanged — serialization still uses camelCase via Pydantic aliases. **Before (v1):** @@ -214,7 +242,7 @@ result = await session.list_tools(cursor="next_page_token") **After (v2):** ```python -from mcp.types import PaginatedRequestParams +from mcp_types import PaginatedRequestParams result = await session.list_resources(params=PaginatedRequestParams(cursor="next_page_token")) result = await session.list_tools(params=PaginatedRequestParams(cursor="next_page_token")) @@ -282,7 +310,7 @@ The constructor signature also changed — it now takes `code`, `message`, and o ```python from mcp.shared.exceptions import McpError -from mcp.types import ErrorData, INVALID_REQUEST +from mcp_types import ErrorData, INVALID_REQUEST raise McpError(ErrorData(code=INVALID_REQUEST, message="bad input")) ``` @@ -291,7 +319,7 @@ raise McpError(ErrorData(code=INVALID_REQUEST, message="bad input")) ```python from mcp.shared.exceptions import MCPError -from mcp.types import INVALID_REQUEST +from mcp_types import INVALID_REQUEST raise MCPError(INVALID_REQUEST, "bad input") # or, if you already have an ErrorData: @@ -448,7 +476,7 @@ In v2, the lowlevel `Server` no longer has decorator methods (handlers are const ```python from mcp.server import ServerRequestContext -from mcp.types import EmptyResult, SetLevelRequestParams, SubscribeRequestParams +from mcp_types import EmptyResult, SetLevelRequestParams, SubscribeRequestParams async def handle_set_logging_level(ctx: ServerRequestContext, params: SetLevelRequestParams) -> EmptyResult: @@ -504,7 +532,7 @@ This means you can no longer access `.root` on these types or use `model_validat **Before (v1):** ```python -from mcp.types import ClientRequest, ServerNotification +from mcp_types import ClientRequest, ServerNotification # Using RootModel.model_validate() request = ClientRequest.model_validate(data) @@ -517,7 +545,7 @@ actual_notification = notification.root **After (v2):** ```python -from mcp.types import client_request_adapter, server_notification_adapter +from mcp_types import client_request_adapter, server_notification_adapter # Using TypeAdapter.validate_python() request = client_request_adapter.validate_python(data) @@ -555,7 +583,7 @@ await session.send_request(PingRequest(), EmptyResult) | `ServerResult` | `server_result_adapter` | | `JSONRPCMessage` | `jsonrpc_message_adapter` | -All adapters are exported from `mcp.types`. +All adapters are exported from `mcp_types`. ### `RequestParams.Meta` replaced with `RequestParamsMeta` TypedDict @@ -716,7 +744,7 @@ The `uri` field on resource-related types now uses `str` instead of Pydantic's ` ```python from pydantic import AnyUrl -from mcp.types import Resource +from mcp_types import Resource # Required wrapping in AnyUrl resource = Resource(name="test", uri=AnyUrl("users/me")) # Would fail validation @@ -725,7 +753,7 @@ resource = Resource(name="test", uri=AnyUrl("users/me")) # Would fail validatio **After (v2):** ```python -from mcp.types import Resource +from mcp_types import Resource # Plain strings accepted resource = Resource(name="test", uri="users/me") # Works @@ -801,7 +829,7 @@ The public `server.request_handlers` and `server.notification_handlers` dictiona ```python # Before (v1) — direct dict access -from mcp.types import ListToolsRequest +from mcp_types import ListToolsRequest if ListToolsRequest in server.request_handlers: ... @@ -837,7 +865,7 @@ async def handle_call_tool(name: str, arguments: dict): ```python from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( CallToolRequestParams, CallToolResult, ListToolsResult, @@ -886,13 +914,13 @@ All handlers receive `ctx: ServerRequestContext` as the first argument. The seco | `@server.progress_notification()` | `on_progress` | `ProgressNotificationParams` | `None` | | — | `on_roots_list_changed` | `NotificationParams \| None` | `None` | -All `params` and return types are importable from `mcp.types`. +All `params` and return types are importable from `mcp_types`. **Notification handlers:** ```python from mcp.server import Server, ServerRequestContext -from mcp.types import ProgressNotificationParams +from mcp_types import ProgressNotificationParams async def handle_progress(ctx: ServerRequestContext, params: ProgressNotificationParams) -> None: @@ -1017,7 +1045,7 @@ async def handle_call_tool(name: str, arguments: dict): ```python from mcp.server import ServerRequestContext -from mcp.types import CallToolRequestParams, CallToolResult, TextContent +from mcp_types import CallToolRequestParams, CallToolResult, TextContent async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult: @@ -1060,7 +1088,7 @@ async def custom_get_task(request: GetTaskRequest) -> GetTaskResult: ```python from mcp.server import Server, ServerRequestContext -from mcp.types import GetTaskRequestParams, GetTaskResult +from mcp_types import GetTaskRequestParams, GetTaskResult async def custom_get_task(ctx: ServerRequestContext, params: GetTaskRequestParams) -> GetTaskResult: @@ -1087,7 +1115,7 @@ MCP protocol types no longer accept arbitrary extra fields at the top level. Thi ```python # This will now raise a validation error -from mcp.types import CallToolRequestParams +from mcp_types import CallToolRequestParams params = CallToolRequestParams( name="my_tool", @@ -1111,7 +1139,7 @@ The `streamable_http_app()` method is now available directly on the lowlevel `Se ```python from mcp.server import Server, ServerRequestContext -from mcp.types import ListToolsResult, PaginatedRequestParams +from mcp_types import ListToolsResult, PaginatedRequestParams async def handle_list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult: diff --git a/docs/testing.md b/docs/testing.md index 9a222c9067..fe60acde49 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -44,7 +44,7 @@ To run the below test, you'll need to install the following dependencies: import pytest from inline_snapshot import snapshot from mcp import Client -from mcp.types import CallToolResult, TextContent +from mcp_types import CallToolResult, TextContent from server import app diff --git a/examples/clients/simple-task-client/mcp_simple_task_client/main.py b/examples/clients/simple-task-client/mcp_simple_task_client/main.py index f9e555c8e6..53f0e62294 100644 --- a/examples/clients/simple-task-client/mcp_simple_task_client/main.py +++ b/examples/clients/simple-task-client/mcp_simple_task_client/main.py @@ -5,7 +5,7 @@ import click from mcp import ClientSession from mcp.client.streamable_http import streamable_http_client -from mcp.types import CallToolResult, TextContent +from mcp_types import CallToolResult, TextContent async def run(url: str) -> None: diff --git a/examples/clients/simple-task-interactive-client/mcp_simple_task_interactive_client/main.py b/examples/clients/simple-task-interactive-client/mcp_simple_task_interactive_client/main.py index ff5f499280..b6db3622d5 100644 --- a/examples/clients/simple-task-interactive-client/mcp_simple_task_interactive_client/main.py +++ b/examples/clients/simple-task-interactive-client/mcp_simple_task_interactive_client/main.py @@ -12,7 +12,7 @@ from mcp import ClientSession from mcp.client.context import ClientRequestContext from mcp.client.streamable_http import streamable_http_client -from mcp.types import ( +from mcp_types import ( CallToolResult, CreateMessageRequestParams, CreateMessageResult, diff --git a/examples/mcpserver/direct_call_tool_result_return.py b/examples/mcpserver/direct_call_tool_result_return.py index 44a316bc6b..c73e6164f5 100644 --- a/examples/mcpserver/direct_call_tool_result_return.py +++ b/examples/mcpserver/direct_call_tool_result_return.py @@ -2,10 +2,10 @@ from typing import Annotated +from mcp_types import CallToolResult, TextContent from pydantic import BaseModel from mcp.server.mcpserver import MCPServer -from mcp.types import CallToolResult, TextContent mcp = MCPServer("Echo Server") diff --git a/examples/servers/everything-server/mcp_everything_server/server.py b/examples/servers/everything-server/mcp_everything_server/server.py index a0620b9c1d..b6415fef5e 100644 --- a/examples/servers/everything-server/mcp_everything_server/server.py +++ b/examples/servers/everything-server/mcp_everything_server/server.py @@ -14,7 +14,7 @@ from mcp.server.mcpserver import Context, MCPServer from mcp.server.mcpserver.prompts.base import UserMessage from mcp.server.streamable_http import EventCallback, EventMessage, EventStore -from mcp.types import ( +from mcp_types import ( AudioContent, Completion, CompletionArgument, diff --git a/examples/servers/simple-pagination/mcp_simple_pagination/server.py b/examples/servers/simple-pagination/mcp_simple_pagination/server.py index c94f2ac3d1..9aca87f730 100644 --- a/examples/servers/simple-pagination/mcp_simple_pagination/server.py +++ b/examples/servers/simple-pagination/mcp_simple_pagination/server.py @@ -8,7 +8,7 @@ import anyio import click -from mcp import types +import mcp_types as types from mcp.server import Server, ServerRequestContext T = TypeVar("T") diff --git a/examples/servers/simple-prompt/mcp_simple_prompt/server.py b/examples/servers/simple-prompt/mcp_simple_prompt/server.py index 74b71b3f38..31e3eb7d76 100644 --- a/examples/servers/simple-prompt/mcp_simple_prompt/server.py +++ b/examples/servers/simple-prompt/mcp_simple_prompt/server.py @@ -1,6 +1,6 @@ import anyio import click -from mcp import types +import mcp_types as types from mcp.server import Server, ServerRequestContext diff --git a/examples/servers/simple-resource/README.md b/examples/servers/simple-resource/README.md index 7fb2ab7cdc..248fe674f6 100644 --- a/examples/servers/simple-resource/README.md +++ b/examples/servers/simple-resource/README.md @@ -22,7 +22,7 @@ Using the MCP client, you can retrieve resources like this using the STDIO trans ```python import asyncio -from mcp.types import AnyUrl +from mcp_types import AnyUrl from mcp.client.session import ClientSession from mcp.client.stdio import StdioServerParameters, stdio_client diff --git a/examples/servers/simple-resource/mcp_simple_resource/server.py b/examples/servers/simple-resource/mcp_simple_resource/server.py index 8d11054145..fe9dcfb709 100644 --- a/examples/servers/simple-resource/mcp_simple_resource/server.py +++ b/examples/servers/simple-resource/mcp_simple_resource/server.py @@ -2,7 +2,7 @@ import anyio import click -from mcp import types +import mcp_types as types from mcp.server import Server, ServerRequestContext SAMPLE_RESOURCES = { diff --git a/examples/servers/simple-streamablehttp-stateless/mcp_simple_streamablehttp_stateless/server.py b/examples/servers/simple-streamablehttp-stateless/mcp_simple_streamablehttp_stateless/server.py index e2b8d2ef2f..f13a8bcfd1 100644 --- a/examples/servers/simple-streamablehttp-stateless/mcp_simple_streamablehttp_stateless/server.py +++ b/examples/servers/simple-streamablehttp-stateless/mcp_simple_streamablehttp_stateless/server.py @@ -2,8 +2,8 @@ import anyio import click +import mcp_types as types import uvicorn -from mcp import types from mcp.server import Server, ServerRequestContext from starlette.middleware.cors import CORSMiddleware diff --git a/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/event_store.py b/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/event_store.py index 3501fa47ce..c9369cfc2c 100644 --- a/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/event_store.py +++ b/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/event_store.py @@ -10,7 +10,7 @@ from uuid import uuid4 from mcp.server.streamable_http import EventCallback, EventId, EventMessage, EventStore, StreamId -from mcp.types import JSONRPCMessage +from mcp_types import JSONRPCMessage logger = logging.getLogger(__name__) diff --git a/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/server.py b/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/server.py index ec9761d1b0..41827f59da 100644 --- a/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/server.py +++ b/examples/servers/simple-streamablehttp/mcp_simple_streamablehttp/server.py @@ -2,8 +2,8 @@ import anyio import click +import mcp_types as types import uvicorn -from mcp import types from mcp.server import Server, ServerRequestContext from starlette.middleware.cors import CORSMiddleware diff --git a/examples/servers/simple-task-interactive/mcp_simple_task_interactive/server.py b/examples/servers/simple-task-interactive/mcp_simple_task_interactive/server.py index bc06e12088..9f12bb887e 100644 --- a/examples/servers/simple-task-interactive/mcp_simple_task_interactive/server.py +++ b/examples/servers/simple-task-interactive/mcp_simple_task_interactive/server.py @@ -9,8 +9,8 @@ from typing import Any import click +import mcp_types as types import uvicorn -from mcp import types from mcp.server import Server, ServerRequestContext from mcp.server.experimental.task_context import ServerTaskContext diff --git a/examples/servers/simple-task/mcp_simple_task/server.py b/examples/servers/simple-task/mcp_simple_task/server.py index 7583cd8f0e..789f46fb3b 100644 --- a/examples/servers/simple-task/mcp_simple_task/server.py +++ b/examples/servers/simple-task/mcp_simple_task/server.py @@ -2,8 +2,8 @@ import anyio import click +import mcp_types as types import uvicorn -from mcp import types from mcp.server import Server, ServerRequestContext from mcp.server.experimental.task_context import ServerTaskContext diff --git a/examples/servers/simple-tool/mcp_simple_tool/server.py b/examples/servers/simple-tool/mcp_simple_tool/server.py index 226058b955..b16249e068 100644 --- a/examples/servers/simple-tool/mcp_simple_tool/server.py +++ b/examples/servers/simple-tool/mcp_simple_tool/server.py @@ -1,6 +1,6 @@ import anyio import click -from mcp import types +import mcp_types as types from mcp.server import Server, ServerRequestContext from mcp.shared._httpx_utils import create_mcp_http_client diff --git a/examples/servers/sse-polling-demo/mcp_sse_polling_demo/event_store.py b/examples/servers/sse-polling-demo/mcp_sse_polling_demo/event_store.py index c77bddef36..e2cca4a2eb 100644 --- a/examples/servers/sse-polling-demo/mcp_sse_polling_demo/event_store.py +++ b/examples/servers/sse-polling-demo/mcp_sse_polling_demo/event_store.py @@ -10,7 +10,7 @@ from uuid import uuid4 from mcp.server.streamable_http import EventCallback, EventId, EventMessage, EventStore, StreamId -from mcp.types import JSONRPCMessage +from mcp_types import JSONRPCMessage logger = logging.getLogger(__name__) diff --git a/examples/servers/sse-polling-demo/mcp_sse_polling_demo/server.py b/examples/servers/sse-polling-demo/mcp_sse_polling_demo/server.py index 14bc174c47..0aa83b33ad 100644 --- a/examples/servers/sse-polling-demo/mcp_sse_polling_demo/server.py +++ b/examples/servers/sse-polling-demo/mcp_sse_polling_demo/server.py @@ -16,8 +16,8 @@ import anyio import click +import mcp_types as types import uvicorn -from mcp import types from mcp.server import Server, ServerRequestContext from .event_store import InMemoryEventStore diff --git a/examples/servers/structured-output-lowlevel/mcp_structured_output_lowlevel/__main__.py b/examples/servers/structured-output-lowlevel/mcp_structured_output_lowlevel/__main__.py index 95fb908540..393ff7a5a0 100644 --- a/examples/servers/structured-output-lowlevel/mcp_structured_output_lowlevel/__main__.py +++ b/examples/servers/structured-output-lowlevel/mcp_structured_output_lowlevel/__main__.py @@ -10,8 +10,9 @@ import random from datetime import datetime +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext diff --git a/examples/snippets/clients/completion_client.py b/examples/snippets/clients/completion_client.py index dc0c1b4f72..52957d97d8 100644 --- a/examples/snippets/clients/completion_client.py +++ b/examples/snippets/clients/completion_client.py @@ -5,9 +5,10 @@ import asyncio import os +from mcp_types import PromptReference, ResourceTemplateReference + from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client -from mcp.types import PromptReference, ResourceTemplateReference # Create server parameters for stdio connection server_params = StdioServerParameters( diff --git a/examples/snippets/clients/pagination_client.py b/examples/snippets/clients/pagination_client.py index b9b8c23ae7..00663ef038 100644 --- a/examples/snippets/clients/pagination_client.py +++ b/examples/snippets/clients/pagination_client.py @@ -2,9 +2,10 @@ import asyncio +from mcp_types import PaginatedRequestParams, Resource + from mcp.client.session import ClientSession from mcp.client.stdio import StdioServerParameters, stdio_client -from mcp.types import PaginatedRequestParams, Resource async def list_all_resources() -> None: diff --git a/examples/snippets/clients/parsing_tool_results.py b/examples/snippets/clients/parsing_tool_results.py index b166406774..f9aade41e3 100644 --- a/examples/snippets/clients/parsing_tool_results.py +++ b/examples/snippets/clients/parsing_tool_results.py @@ -2,7 +2,9 @@ import asyncio -from mcp import ClientSession, StdioServerParameters, types +import mcp_types as types + +from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client diff --git a/examples/snippets/clients/stdio_client.py b/examples/snippets/clients/stdio_client.py index c1f85f42a3..edea3c34f3 100644 --- a/examples/snippets/clients/stdio_client.py +++ b/examples/snippets/clients/stdio_client.py @@ -5,7 +5,9 @@ import asyncio import os -from mcp import ClientSession, StdioServerParameters, types +import mcp_types as types + +from mcp import ClientSession, StdioServerParameters from mcp.client.context import ClientRequestContext from mcp.client.stdio import stdio_client diff --git a/examples/snippets/clients/url_elicitation_client.py b/examples/snippets/clients/url_elicitation_client.py index 2aecbeeee6..de962eb718 100644 --- a/examples/snippets/clients/url_elicitation_client.py +++ b/examples/snippets/clients/url_elicitation_client.py @@ -28,11 +28,13 @@ from typing import Any from urllib.parse import urlparse -from mcp import ClientSession, types +import mcp_types as types +from mcp_types import URL_ELICITATION_REQUIRED + +from mcp import ClientSession from mcp.client.context import ClientRequestContext from mcp.client.sse import sse_client from mcp.shared.exceptions import MCPError, UrlElicitationRequiredError -from mcp.types import URL_ELICITATION_REQUIRED async def handle_elicitation( diff --git a/examples/snippets/servers/completion.py b/examples/snippets/servers/completion.py index 47accffa3b..7fc2f20454 100644 --- a/examples/snippets/servers/completion.py +++ b/examples/snippets/servers/completion.py @@ -1,5 +1,4 @@ -from mcp.server.mcpserver import MCPServer -from mcp.types import ( +from mcp_types import ( Completion, CompletionArgument, CompletionContext, @@ -7,6 +6,8 @@ ResourceTemplateReference, ) +from mcp.server.mcpserver import MCPServer + mcp = MCPServer(name="Example") diff --git a/examples/snippets/servers/direct_call_tool_result.py b/examples/snippets/servers/direct_call_tool_result.py index 4c98c358ee..f3035338b3 100644 --- a/examples/snippets/servers/direct_call_tool_result.py +++ b/examples/snippets/servers/direct_call_tool_result.py @@ -2,10 +2,10 @@ from typing import Annotated +from mcp_types import CallToolResult, TextContent from pydantic import BaseModel from mcp.server.mcpserver import MCPServer -from mcp.types import CallToolResult, TextContent mcp = MCPServer("CallToolResult Example") diff --git a/examples/snippets/servers/elicitation.py b/examples/snippets/servers/elicitation.py index 79453f543e..97e847b510 100644 --- a/examples/snippets/servers/elicitation.py +++ b/examples/snippets/servers/elicitation.py @@ -7,11 +7,11 @@ import uuid +from mcp_types import ElicitRequestURLParams from pydantic import BaseModel, Field from mcp.server.mcpserver import Context, MCPServer from mcp.shared.exceptions import UrlElicitationRequiredError -from mcp.types import ElicitRequestURLParams mcp = MCPServer(name="Elicitation Example") diff --git a/examples/snippets/servers/lowlevel/basic.py b/examples/snippets/servers/lowlevel/basic.py index 81f40e9945..ff9b0a2c49 100644 --- a/examples/snippets/servers/lowlevel/basic.py +++ b/examples/snippets/servers/lowlevel/basic.py @@ -4,8 +4,9 @@ import asyncio +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext diff --git a/examples/snippets/servers/lowlevel/direct_call_tool_result.py b/examples/snippets/servers/lowlevel/direct_call_tool_result.py index 7e8fc4dcb3..4d6607d2ff 100644 --- a/examples/snippets/servers/lowlevel/direct_call_tool_result.py +++ b/examples/snippets/servers/lowlevel/direct_call_tool_result.py @@ -4,8 +4,9 @@ import asyncio +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext diff --git a/examples/snippets/servers/lowlevel/lifespan.py b/examples/snippets/servers/lowlevel/lifespan.py index bcd96c8935..46db9ecc07 100644 --- a/examples/snippets/servers/lowlevel/lifespan.py +++ b/examples/snippets/servers/lowlevel/lifespan.py @@ -6,8 +6,9 @@ from contextlib import asynccontextmanager from typing import TypedDict +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext diff --git a/examples/snippets/servers/lowlevel/structured_output.py b/examples/snippets/servers/lowlevel/structured_output.py index f93c8875fd..84e411ff55 100644 --- a/examples/snippets/servers/lowlevel/structured_output.py +++ b/examples/snippets/servers/lowlevel/structured_output.py @@ -5,8 +5,9 @@ import asyncio import json +import mcp_types as types + import mcp.server.stdio -from mcp import types from mcp.server import Server, ServerRequestContext diff --git a/examples/snippets/servers/pagination_example.py b/examples/snippets/servers/pagination_example.py index bcd0ffb106..4f7435acf6 100644 --- a/examples/snippets/servers/pagination_example.py +++ b/examples/snippets/servers/pagination_example.py @@ -1,6 +1,7 @@ """Example of implementing pagination with the low-level MCP server.""" -from mcp import types +import mcp_types as types + from mcp.server import Server, ServerRequestContext # Sample data to paginate diff --git a/examples/snippets/servers/sampling.py b/examples/snippets/servers/sampling.py index 43259589a4..394fd6a664 100644 --- a/examples/snippets/servers/sampling.py +++ b/examples/snippets/servers/sampling.py @@ -1,5 +1,6 @@ +from mcp_types import SamplingMessage, TextContent + from mcp.server.mcpserver import Context, MCPServer -from mcp.types import SamplingMessage, TextContent mcp = MCPServer(name="Sampling Example") diff --git a/pyproject.toml b/pyproject.toml index 6d2319621a..5bc3c8e9f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,57 +1,8 @@ -[project] -name = "mcp" -dynamic = ["version"] -description = "Model Context Protocol SDK" -readme = "README.md" -requires-python = ">=3.10" -authors = [{ name = "Model Context Protocol a Series of LF Projects, LLC." }] -maintainers = [ - { name = "David Soria Parra", email = "davidsp@anthropic.com" }, - { name = "Marcelo Trylesinski", email = "marcelotryle@gmail.com" }, - { name = "Max Isbey", email = "maxisbey@anthropic.com" }, - { name = "Felix Weinberger", email = "fweinberger@anthropic.com" }, -] -keywords = ["git", "mcp", "llm", "automation"] -license = { text = "MIT" } -classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", -] -dependencies = [ - "anyio>=4.9", - "httpx>=0.27.1,<1.0.0", - "httpx-sse>=0.4", - "pydantic>=2.12.0", - "starlette>=0.48.0; python_version >= '3.14'", - "starlette>=0.27; python_version < '3.14'", - "python-multipart>=0.0.9", - "sse-starlette>=3.0.0", - "pydantic-settings>=2.5.2", - "uvicorn>=0.31.1; sys_platform != 'emscripten'", - "jsonschema>=4.20.0", - "pywin32>=311; sys_platform == 'win32'", - "pyjwt[crypto]>=2.10.1", - "typing-extensions>=4.13.0", - "typing-inspection>=0.4.1", - "opentelemetry-api>=1.28.0", -] - -[project.optional-dependencies] -rich = ["rich>=13.9.4"] -cli = ["typer>=0.16.0", "python-dotenv>=1.0.0"] -ws = ["websockets>=15.0.1"] - -[project.scripts] -mcp = "mcp.cli:app [cli]" +# This is the workspace coordinator. It is not itself a package; the distributable +# packages live under `src/mcp` and `src/mcp-types` with their own pyproject.toml. [tool.uv] +package = false default-groups = ["dev", "docs"] required-version = ">=0.9.5" # PEP 517 build isolation fetches [build-system].requires (and transitives) at @@ -101,31 +52,11 @@ docs = [ "mkdocstrings-python>=2.0.1", ] -[build-system] -requires = ["hatchling", "uv-dynamic-versioning"] -build-backend = "hatchling.build" - -[tool.hatch.version] -source = "uv-dynamic-versioning" - -[tool.uv-dynamic-versioning] -vcs = "git" -style = "pep440" -bump = true - -[project.urls] -Homepage = "https://modelcontextprotocol.io" -Documentation = "https://py.sdk.modelcontextprotocol.io/v2/" -Repository = "https://github.com/modelcontextprotocol/python-sdk" -Issues = "https://github.com/modelcontextprotocol/python-sdk/issues" - -[tool.hatch.build.targets.wheel] -packages = ["src/mcp"] - [tool.pyright] typeCheckingMode = "strict" include = [ "src/mcp", + "src/mcp-types", "tests", "examples/servers", "examples/snippets", @@ -184,10 +115,11 @@ max-returns = 13 # Default is 6 max-statements = 102 # Default is 50 [tool.uv.workspace] -members = ["examples/clients/*", "examples/servers/*", "examples/snippets"] +members = ["src/mcp", "src/mcp-types", "examples/clients/*", "examples/servers/*", "examples/snippets"] [tool.uv.sources] mcp = { workspace = true } +mcp-types = { workspace = true } strict-no-cover = { git = "https://github.com/pydantic/strict-no-cover" } [tool.pytest.ini_options] @@ -229,10 +161,10 @@ patch = ["subprocess"] concurrency = ["multiprocessing", "thread"] source = ["src", "tests"] omit = [ - "src/mcp/client/__main__.py", - "src/mcp/server/__main__.py", - "src/mcp/os/posix/utilities.py", - "src/mcp/os/win32/utilities.py", + "src/mcp/mcp/client/__main__.py", + "src/mcp/mcp/server/__main__.py", + "src/mcp/mcp/os/posix/utilities.py", + "src/mcp/mcp/os/win32/utilities.py", ] # https://coverage.readthedocs.io/en/latest/config.html#report diff --git a/src/mcp-types/README.md b/src/mcp-types/README.md new file mode 100644 index 0000000000..0e587dd435 --- /dev/null +++ b/src/mcp-types/README.md @@ -0,0 +1,11 @@ +# mcp-types + +Type definitions for the [Model Context Protocol](https://modelcontextprotocol.io). + +This package contains the Pydantic models and JSON-RPC types that describe the MCP wire +protocol. It is a dependency of the [`mcp`](https://pypi.org/project/mcp/) SDK and can be +used on its own when you only need the protocol types without the client/server runtime. + +```python +from mcp_types import Tool, CallToolRequest +``` diff --git a/src/mcp/types/__init__.py b/src/mcp-types/mcp_types/__init__.py similarity index 97% rename from src/mcp/types/__init__.py rename to src/mcp-types/mcp_types/__init__.py index b442303937..331ef8dadd 100644 --- a/src/mcp/types/__init__.py +++ b/src/mcp-types/mcp_types/__init__.py @@ -1,11 +1,10 @@ -"""This module defines the types for the MCP protocol. +"""This package defines the types for the MCP protocol. Check the latest schema at: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/2025-11-25/schema.json """ -# Re-export everything from _types for backward compatibility -from mcp.types._types import ( +from mcp_types._types import ( DEFAULT_NEGOTIATED_VERSION, LATEST_PROTOCOL_VERSION, TASK_FORBIDDEN, @@ -183,9 +182,7 @@ server_request_adapter, server_result_adapter, ) - -# Re-export JSONRPC types -from mcp.types.jsonrpc import ( +from mcp_types.jsonrpc import ( CONNECTION_CLOSED, INTERNAL_ERROR, INVALID_PARAMS, diff --git a/src/mcp/types/_types.py b/src/mcp-types/mcp_types/_types.py similarity index 99% rename from src/mcp/types/_types.py rename to src/mcp-types/mcp_types/_types.py index 9005d253af..0d1fbbc773 100644 --- a/src/mcp/types/_types.py +++ b/src/mcp-types/mcp_types/_types.py @@ -7,7 +7,7 @@ from pydantic.alias_generators import to_camel from typing_extensions import NotRequired, TypedDict -from mcp.types.jsonrpc import RequestId +from mcp_types.jsonrpc import RequestId LATEST_PROTOCOL_VERSION = "2025-11-25" """The latest version of the Model Context Protocol. diff --git a/src/mcp/types/jsonrpc.py b/src/mcp-types/mcp_types/jsonrpc.py similarity index 100% rename from src/mcp/types/jsonrpc.py rename to src/mcp-types/mcp_types/jsonrpc.py diff --git a/src/mcp/py.typed b/src/mcp-types/mcp_types/py.typed similarity index 100% rename from src/mcp/py.typed rename to src/mcp-types/mcp_types/py.typed diff --git a/src/mcp-types/pyproject.toml b/src/mcp-types/pyproject.toml new file mode 100644 index 0000000000..7727992da3 --- /dev/null +++ b/src/mcp-types/pyproject.toml @@ -0,0 +1,55 @@ +[build-system] +requires = ["hatchling", "uv-dynamic-versioning"] +build-backend = "hatchling.build" + +[tool.hatch.version] +source = "uv-dynamic-versioning" + +[tool.uv-dynamic-versioning] +vcs = "git" +style = "pep440" +bump = true +fallback-version = "0.0.0" + +[project] +name = "mcp-types" +dynamic = ["version"] +description = "Type definitions for the Model Context Protocol" +readme = "README.md" +requires-python = ">=3.10" +authors = [{ name = "Model Context Protocol a Series of LF Projects, LLC." }] +maintainers = [ + { name = "David Soria Parra", email = "davidsp@anthropic.com" }, + { name = "Marcelo Trylesinski", email = "marcelotryle@gmail.com" }, + { name = "Max Isbey", email = "maxisbey@anthropic.com" }, + { name = "Felix Weinberger", email = "fweinberger@anthropic.com" }, +] +keywords = ["mcp", "llm", "types", "schema"] +license = { text = "MIT" } +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", +] +dependencies = [ + "pydantic>=2.12.0", + "typing-extensions>=4.13.0", +] + +[project.urls] +Homepage = "https://modelcontextprotocol.io" +Documentation = "https://py.sdk.modelcontextprotocol.io/v2/" +Repository = "https://github.com/modelcontextprotocol/python-sdk" +Issues = "https://github.com/modelcontextprotocol/python-sdk/issues" + +[tool.hatch.build.targets.wheel] +packages = ["mcp_types"] + +[tool.hatch.build.targets.sdist] +include = ["/mcp_types", "/README.md"] diff --git a/src/mcp/__init__.py b/src/mcp/mcp/__init__.py similarity index 97% rename from src/mcp/__init__.py rename to src/mcp/mcp/__init__.py index 4b5caa9cca..c4d167b561 100644 --- a/src/mcp/__init__.py +++ b/src/mcp/mcp/__init__.py @@ -1,11 +1,4 @@ -from .client.client import Client -from .client.session import ClientSession -from .client.session_group import ClientSessionGroup -from .client.stdio import StdioServerParameters, stdio_client -from .server.session import ServerSession -from .server.stdio import stdio_server -from .shared.exceptions import MCPError, UrlElicitationRequiredError -from .types import ( +from mcp_types import ( CallToolRequest, ClientCapabilities, ClientNotification, @@ -63,7 +56,15 @@ ToolUseContent, UnsubscribeRequest, ) -from .types import Role as SamplingRole +from mcp_types import Role as SamplingRole + +from .client.client import Client +from .client.session import ClientSession +from .client.session_group import ClientSessionGroup +from .client.stdio import StdioServerParameters, stdio_client +from .server.session import ServerSession +from .server.stdio import stdio_server +from .shared.exceptions import MCPError, UrlElicitationRequiredError __all__ = [ "CallToolRequest", diff --git a/src/mcp/cli/__init__.py b/src/mcp/mcp/cli/__init__.py similarity index 100% rename from src/mcp/cli/__init__.py rename to src/mcp/mcp/cli/__init__.py diff --git a/src/mcp/cli/claude.py b/src/mcp/mcp/cli/claude.py similarity index 100% rename from src/mcp/cli/claude.py rename to src/mcp/mcp/cli/claude.py diff --git a/src/mcp/cli/cli.py b/src/mcp/mcp/cli/cli.py similarity index 100% rename from src/mcp/cli/cli.py rename to src/mcp/mcp/cli/cli.py diff --git a/src/mcp/client/__init__.py b/src/mcp/mcp/client/__init__.py similarity index 100% rename from src/mcp/client/__init__.py rename to src/mcp/mcp/client/__init__.py diff --git a/src/mcp/client/__main__.py b/src/mcp/mcp/client/__main__.py similarity index 98% rename from src/mcp/client/__main__.py rename to src/mcp/mcp/client/__main__.py index b9ec344226..5fa3ce109b 100644 --- a/src/mcp/client/__main__.py +++ b/src/mcp/mcp/client/__main__.py @@ -6,8 +6,8 @@ from urllib.parse import urlparse import anyio +import mcp_types as types -from mcp import types from mcp.client._transport import ReadStream, WriteStream from mcp.client.session import ClientSession from mcp.client.sse import sse_client diff --git a/src/mcp/client/_memory.py b/src/mcp/mcp/client/_memory.py similarity index 100% rename from src/mcp/client/_memory.py rename to src/mcp/mcp/client/_memory.py diff --git a/src/mcp/client/_transport.py b/src/mcp/mcp/client/_transport.py similarity index 100% rename from src/mcp/client/_transport.py rename to src/mcp/mcp/client/_transport.py diff --git a/src/mcp/client/auth/__init__.py b/src/mcp/mcp/client/auth/__init__.py similarity index 100% rename from src/mcp/client/auth/__init__.py rename to src/mcp/mcp/client/auth/__init__.py diff --git a/src/mcp/client/auth/exceptions.py b/src/mcp/mcp/client/auth/exceptions.py similarity index 100% rename from src/mcp/client/auth/exceptions.py rename to src/mcp/mcp/client/auth/exceptions.py diff --git a/src/mcp/client/auth/extensions/__init__.py b/src/mcp/mcp/client/auth/extensions/__init__.py similarity index 100% rename from src/mcp/client/auth/extensions/__init__.py rename to src/mcp/mcp/client/auth/extensions/__init__.py diff --git a/src/mcp/client/auth/extensions/client_credentials.py b/src/mcp/mcp/client/auth/extensions/client_credentials.py similarity index 100% rename from src/mcp/client/auth/extensions/client_credentials.py rename to src/mcp/mcp/client/auth/extensions/client_credentials.py diff --git a/src/mcp/client/auth/oauth2.py b/src/mcp/mcp/client/auth/oauth2.py similarity index 100% rename from src/mcp/client/auth/oauth2.py rename to src/mcp/mcp/client/auth/oauth2.py diff --git a/src/mcp/client/auth/utils.py b/src/mcp/mcp/client/auth/utils.py similarity index 99% rename from src/mcp/client/auth/utils.py rename to src/mcp/mcp/client/auth/utils.py index d75324f2f0..f7790b88b0 100644 --- a/src/mcp/client/auth/utils.py +++ b/src/mcp/mcp/client/auth/utils.py @@ -2,6 +2,7 @@ from urllib.parse import urljoin, urlparse from httpx import Request, Response +from mcp_types import LATEST_PROTOCOL_VERSION from pydantic import AnyUrl, ValidationError from mcp.client.auth import OAuthRegistrationError, OAuthTokenError @@ -13,7 +14,6 @@ OAuthToken, ProtectedResourceMetadata, ) -from mcp.types import LATEST_PROTOCOL_VERSION def extract_field_from_www_auth(response: Response, field_name: str) -> str | None: diff --git a/src/mcp/client/client.py b/src/mcp/mcp/client/client.py similarity index 99% rename from src/mcp/client/client.py rename to src/mcp/mcp/client/client.py index b33fea4052..7566b7f97e 100644 --- a/src/mcp/client/client.py +++ b/src/mcp/mcp/client/client.py @@ -6,14 +6,7 @@ from dataclasses import KW_ONLY, dataclass, field from typing import Any -from mcp.client._memory import InMemoryTransport -from mcp.client._transport import Transport -from mcp.client.session import ClientSession, ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT -from mcp.client.streamable_http import streamable_http_client -from mcp.server import Server -from mcp.server.mcpserver import MCPServer -from mcp.shared.session import ProgressFnT -from mcp.types import ( +from mcp_types import ( CallToolResult, CompleteResult, EmptyResult, @@ -32,6 +25,14 @@ ResourceTemplateReference, ) +from mcp.client._memory import InMemoryTransport +from mcp.client._transport import Transport +from mcp.client.session import ClientSession, ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT +from mcp.client.streamable_http import streamable_http_client +from mcp.server import Server +from mcp.server.mcpserver import MCPServer +from mcp.shared.session import ProgressFnT + @dataclass class Client: diff --git a/src/mcp/client/context.py b/src/mcp/mcp/client/context.py similarity index 100% rename from src/mcp/client/context.py rename to src/mcp/mcp/client/context.py diff --git a/src/mcp/client/experimental/__init__.py b/src/mcp/mcp/client/experimental/__init__.py similarity index 100% rename from src/mcp/client/experimental/__init__.py rename to src/mcp/mcp/client/experimental/__init__.py diff --git a/src/mcp/client/experimental/task_handlers.py b/src/mcp/mcp/client/experimental/task_handlers.py similarity index 99% rename from src/mcp/client/experimental/task_handlers.py rename to src/mcp/mcp/client/experimental/task_handlers.py index 0ab513236a..7bba1c6d60 100644 --- a/src/mcp/client/experimental/task_handlers.py +++ b/src/mcp/mcp/client/experimental/task_handlers.py @@ -16,9 +16,9 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Protocol +import mcp_types as types from pydantic import TypeAdapter -from mcp import types from mcp.shared._context import RequestContext from mcp.shared.session import RequestResponder diff --git a/src/mcp/client/experimental/tasks.py b/src/mcp/mcp/client/experimental/tasks.py similarity index 98% rename from src/mcp/client/experimental/tasks.py rename to src/mcp/mcp/client/experimental/tasks.py index a566df766b..88236937d3 100644 --- a/src/mcp/client/experimental/tasks.py +++ b/src/mcp/mcp/client/experimental/tasks.py @@ -28,9 +28,10 @@ from collections.abc import AsyncIterator from typing import TYPE_CHECKING, Any, TypeVar -from mcp import types +import mcp_types as types +from mcp_types._types import RequestParamsMeta + from mcp.shared.experimental.tasks.polling import poll_until_terminal -from mcp.types._types import RequestParamsMeta if TYPE_CHECKING: from mcp.client.session import ClientSession diff --git a/src/mcp/client/session.py b/src/mcp/mcp/client/session.py similarity index 99% rename from src/mcp/client/session.py rename to src/mcp/mcp/client/session.py index 86113874be..40fdf49cb3 100644 --- a/src/mcp/client/session.py +++ b/src/mcp/mcp/client/session.py @@ -4,9 +4,10 @@ from typing import Any, Protocol import anyio.lowlevel +import mcp_types as types +from mcp_types._types import RequestParamsMeta from pydantic import TypeAdapter -from mcp import types from mcp.client._transport import ReadStream, WriteStream from mcp.client.experimental import ExperimentalClientFeatures from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers @@ -14,7 +15,6 @@ from mcp.shared.message import SessionMessage from mcp.shared.session import BaseSession, ProgressFnT, RequestResponder from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS -from mcp.types._types import RequestParamsMeta DEFAULT_CLIENT_INFO = types.Implementation(name="mcp", version="0.1.0") diff --git a/src/mcp/client/session_group.py b/src/mcp/mcp/client/session_group.py similarity index 99% rename from src/mcp/client/session_group.py rename to src/mcp/mcp/client/session_group.py index 9610212642..2dd1c29729 100644 --- a/src/mcp/client/session_group.py +++ b/src/mcp/mcp/client/session_group.py @@ -15,11 +15,11 @@ import anyio import httpx +import mcp_types as types from pydantic import BaseModel, Field from typing_extensions import Self import mcp -from mcp import types from mcp.client.session import ElicitationFnT, ListRootsFnT, LoggingFnT, MessageHandlerFnT, SamplingFnT from mcp.client.sse import sse_client from mcp.client.stdio import StdioServerParameters diff --git a/src/mcp/client/sse.py b/src/mcp/mcp/client/sse.py similarity index 99% rename from src/mcp/client/sse.py rename to src/mcp/mcp/client/sse.py index 74e5ba8062..2e96ac2a2e 100644 --- a/src/mcp/client/sse.py +++ b/src/mcp/mcp/client/sse.py @@ -6,10 +6,10 @@ import anyio import httpx +import mcp_types as types from anyio.abc import TaskStatus from httpx_sse import SSEError, aconnect_sse -from mcp import types from mcp.shared._context_streams import create_context_streams from mcp.shared._httpx_utils import McpHttpClientFactory, create_mcp_http_client from mcp.shared.message import SessionMessage diff --git a/src/mcp/client/stdio.py b/src/mcp/mcp/client/stdio.py similarity index 99% rename from src/mcp/client/stdio.py rename to src/mcp/mcp/client/stdio.py index 902dc8576c..535fa8ce26 100644 --- a/src/mcp/client/stdio.py +++ b/src/mcp/mcp/client/stdio.py @@ -7,12 +7,12 @@ import anyio import anyio.lowlevel +import mcp_types as types from anyio.abc import Process from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream from anyio.streams.text import TextReceiveStream from pydantic import BaseModel, Field -from mcp import types from mcp.os.posix.utilities import terminate_posix_process_tree from mcp.os.win32.utilities import ( FallbackProcess, diff --git a/src/mcp/client/streamable_http.py b/src/mcp/mcp/client/streamable_http.py similarity index 99% rename from src/mcp/client/streamable_http.py rename to src/mcp/mcp/client/streamable_http.py index aa3e50e07e..8fc352ea63 100644 --- a/src/mcp/client/streamable_http.py +++ b/src/mcp/mcp/client/streamable_http.py @@ -12,13 +12,7 @@ import httpx from anyio.abc import TaskGroup from httpx_sse import EventSource, ServerSentEvent, aconnect_sse -from pydantic import ValidationError - -from mcp.client._transport import TransportStreams -from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams -from mcp.shared._httpx_utils import create_mcp_http_client -from mcp.shared.message import ClientMessageMetadata, SessionMessage -from mcp.types import ( +from mcp_types import ( INTERNAL_ERROR, INVALID_REQUEST, PARSE_ERROR, @@ -32,6 +26,12 @@ RequestId, jsonrpc_message_adapter, ) +from pydantic import ValidationError + +from mcp.client._transport import TransportStreams +from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams +from mcp.shared._httpx_utils import create_mcp_http_client +from mcp.shared.message import ClientMessageMetadata, SessionMessage logger = logging.getLogger(__name__) diff --git a/src/mcp/client/websocket.py b/src/mcp/mcp/client/websocket.py similarity index 99% rename from src/mcp/client/websocket.py rename to src/mcp/mcp/client/websocket.py index de473f36d3..c2cd3dac58 100644 --- a/src/mcp/client/websocket.py +++ b/src/mcp/mcp/client/websocket.py @@ -3,12 +3,12 @@ from contextlib import asynccontextmanager import anyio +import mcp_types as types from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream from pydantic import ValidationError from websockets.asyncio.client import connect as ws_connect from websockets.typing import Subprotocol -from mcp import types from mcp.shared.message import SessionMessage diff --git a/src/mcp/os/__init__.py b/src/mcp/mcp/os/__init__.py similarity index 100% rename from src/mcp/os/__init__.py rename to src/mcp/mcp/os/__init__.py diff --git a/src/mcp/os/posix/__init__.py b/src/mcp/mcp/os/posix/__init__.py similarity index 100% rename from src/mcp/os/posix/__init__.py rename to src/mcp/mcp/os/posix/__init__.py diff --git a/src/mcp/os/posix/utilities.py b/src/mcp/mcp/os/posix/utilities.py similarity index 100% rename from src/mcp/os/posix/utilities.py rename to src/mcp/mcp/os/posix/utilities.py diff --git a/src/mcp/os/win32/__init__.py b/src/mcp/mcp/os/win32/__init__.py similarity index 100% rename from src/mcp/os/win32/__init__.py rename to src/mcp/mcp/os/win32/__init__.py diff --git a/src/mcp/os/win32/utilities.py b/src/mcp/mcp/os/win32/utilities.py similarity index 100% rename from src/mcp/os/win32/utilities.py rename to src/mcp/mcp/os/win32/utilities.py diff --git a/src/mcp/shared/__init__.py b/src/mcp/mcp/py.typed similarity index 100% rename from src/mcp/shared/__init__.py rename to src/mcp/mcp/py.typed diff --git a/src/mcp/server/__init__.py b/src/mcp/mcp/server/__init__.py similarity index 100% rename from src/mcp/server/__init__.py rename to src/mcp/mcp/server/__init__.py diff --git a/src/mcp/server/__main__.py b/src/mcp/mcp/server/__main__.py similarity index 96% rename from src/mcp/server/__main__.py rename to src/mcp/mcp/server/__main__.py index dbc50b8a79..4ccc47e75b 100644 --- a/src/mcp/server/__main__.py +++ b/src/mcp/mcp/server/__main__.py @@ -4,11 +4,11 @@ import warnings import anyio +from mcp_types import ServerCapabilities from mcp.server.models import InitializationOptions from mcp.server.session import ServerSession from mcp.server.stdio import stdio_server -from mcp.types import ServerCapabilities if not sys.warnoptions: warnings.simplefilter("ignore") diff --git a/src/mcp/server/auth/__init__.py b/src/mcp/mcp/server/auth/__init__.py similarity index 100% rename from src/mcp/server/auth/__init__.py rename to src/mcp/mcp/server/auth/__init__.py diff --git a/src/mcp/server/auth/errors.py b/src/mcp/mcp/server/auth/errors.py similarity index 100% rename from src/mcp/server/auth/errors.py rename to src/mcp/mcp/server/auth/errors.py diff --git a/src/mcp/server/auth/handlers/__init__.py b/src/mcp/mcp/server/auth/handlers/__init__.py similarity index 100% rename from src/mcp/server/auth/handlers/__init__.py rename to src/mcp/mcp/server/auth/handlers/__init__.py diff --git a/src/mcp/server/auth/handlers/authorize.py b/src/mcp/mcp/server/auth/handlers/authorize.py similarity index 100% rename from src/mcp/server/auth/handlers/authorize.py rename to src/mcp/mcp/server/auth/handlers/authorize.py diff --git a/src/mcp/server/auth/handlers/metadata.py b/src/mcp/mcp/server/auth/handlers/metadata.py similarity index 100% rename from src/mcp/server/auth/handlers/metadata.py rename to src/mcp/mcp/server/auth/handlers/metadata.py diff --git a/src/mcp/server/auth/handlers/register.py b/src/mcp/mcp/server/auth/handlers/register.py similarity index 100% rename from src/mcp/server/auth/handlers/register.py rename to src/mcp/mcp/server/auth/handlers/register.py diff --git a/src/mcp/server/auth/handlers/revoke.py b/src/mcp/mcp/server/auth/handlers/revoke.py similarity index 100% rename from src/mcp/server/auth/handlers/revoke.py rename to src/mcp/mcp/server/auth/handlers/revoke.py diff --git a/src/mcp/server/auth/handlers/token.py b/src/mcp/mcp/server/auth/handlers/token.py similarity index 100% rename from src/mcp/server/auth/handlers/token.py rename to src/mcp/mcp/server/auth/handlers/token.py diff --git a/src/mcp/server/auth/json_response.py b/src/mcp/mcp/server/auth/json_response.py similarity index 100% rename from src/mcp/server/auth/json_response.py rename to src/mcp/mcp/server/auth/json_response.py diff --git a/src/mcp/server/auth/middleware/__init__.py b/src/mcp/mcp/server/auth/middleware/__init__.py similarity index 100% rename from src/mcp/server/auth/middleware/__init__.py rename to src/mcp/mcp/server/auth/middleware/__init__.py diff --git a/src/mcp/server/auth/middleware/auth_context.py b/src/mcp/mcp/server/auth/middleware/auth_context.py similarity index 100% rename from src/mcp/server/auth/middleware/auth_context.py rename to src/mcp/mcp/server/auth/middleware/auth_context.py diff --git a/src/mcp/server/auth/middleware/bearer_auth.py b/src/mcp/mcp/server/auth/middleware/bearer_auth.py similarity index 100% rename from src/mcp/server/auth/middleware/bearer_auth.py rename to src/mcp/mcp/server/auth/middleware/bearer_auth.py diff --git a/src/mcp/server/auth/middleware/client_auth.py b/src/mcp/mcp/server/auth/middleware/client_auth.py similarity index 100% rename from src/mcp/server/auth/middleware/client_auth.py rename to src/mcp/mcp/server/auth/middleware/client_auth.py diff --git a/src/mcp/server/auth/provider.py b/src/mcp/mcp/server/auth/provider.py similarity index 100% rename from src/mcp/server/auth/provider.py rename to src/mcp/mcp/server/auth/provider.py diff --git a/src/mcp/server/auth/routes.py b/src/mcp/mcp/server/auth/routes.py similarity index 100% rename from src/mcp/server/auth/routes.py rename to src/mcp/mcp/server/auth/routes.py diff --git a/src/mcp/server/auth/settings.py b/src/mcp/mcp/server/auth/settings.py similarity index 100% rename from src/mcp/server/auth/settings.py rename to src/mcp/mcp/server/auth/settings.py diff --git a/src/mcp/server/context.py b/src/mcp/mcp/server/context.py similarity index 100% rename from src/mcp/server/context.py rename to src/mcp/mcp/server/context.py diff --git a/src/mcp/server/elicitation.py b/src/mcp/mcp/server/elicitation.py similarity index 99% rename from src/mcp/server/elicitation.py rename to src/mcp/mcp/server/elicitation.py index 731c914edc..90a454a59c 100644 --- a/src/mcp/server/elicitation.py +++ b/src/mcp/mcp/server/elicitation.py @@ -6,10 +6,10 @@ from collections.abc import Sequence from typing import Generic, Literal, TypeVar, Union, get_args, get_origin +from mcp_types import RequestId from pydantic import BaseModel from mcp.server.session import ServerSession -from mcp.types import RequestId ElicitSchemaModelT = TypeVar("ElicitSchemaModelT", bound=BaseModel) diff --git a/src/mcp/server/experimental/__init__.py b/src/mcp/mcp/server/experimental/__init__.py similarity index 100% rename from src/mcp/server/experimental/__init__.py rename to src/mcp/mcp/server/experimental/__init__.py diff --git a/src/mcp/server/experimental/request_context.py b/src/mcp/mcp/server/experimental/request_context.py similarity index 99% rename from src/mcp/server/experimental/request_context.py rename to src/mcp/mcp/server/experimental/request_context.py index 3eba65822a..4e6b658fcd 100644 --- a/src/mcp/server/experimental/request_context.py +++ b/src/mcp/mcp/server/experimental/request_context.py @@ -10,12 +10,7 @@ from dataclasses import dataclass, field from typing import Any -from mcp.server.experimental.task_context import ServerTaskContext -from mcp.server.experimental.task_support import TaskSupport -from mcp.server.session import ServerSession -from mcp.shared.exceptions import MCPError -from mcp.shared.experimental.tasks.helpers import MODEL_IMMEDIATE_RESPONSE_KEY, is_terminal -from mcp.types import ( +from mcp_types import ( METHOD_NOT_FOUND, TASK_FORBIDDEN, TASK_REQUIRED, @@ -28,6 +23,12 @@ Tool, ) +from mcp.server.experimental.task_context import ServerTaskContext +from mcp.server.experimental.task_support import TaskSupport +from mcp.server.session import ServerSession +from mcp.shared.exceptions import MCPError +from mcp.shared.experimental.tasks.helpers import MODEL_IMMEDIATE_RESPONSE_KEY, is_terminal + @dataclass class Experimental: diff --git a/src/mcp/server/experimental/session_features.py b/src/mcp/mcp/server/experimental/session_features.py similarity index 99% rename from src/mcp/server/experimental/session_features.py rename to src/mcp/mcp/server/experimental/session_features.py index 2f9d1b0320..9dbfeaab5e 100644 --- a/src/mcp/server/experimental/session_features.py +++ b/src/mcp/mcp/server/experimental/session_features.py @@ -9,7 +9,8 @@ from collections.abc import AsyncIterator from typing import TYPE_CHECKING, Any, TypeVar -from mcp import types +import mcp_types as types + from mcp.server.validation import validate_sampling_tools, validate_tool_use_result_messages from mcp.shared.experimental.tasks.capabilities import ( require_task_augmented_elicitation, diff --git a/src/mcp/server/experimental/task_context.py b/src/mcp/mcp/server/experimental/task_context.py similarity index 99% rename from src/mcp/server/experimental/task_context.py rename to src/mcp/mcp/server/experimental/task_context.py index 1fc45badfd..762006a182 100644 --- a/src/mcp/server/experimental/task_context.py +++ b/src/mcp/mcp/server/experimental/task_context.py @@ -9,20 +9,7 @@ from typing import Any import anyio - -from mcp.server.experimental.task_result_handler import TaskResultHandler -from mcp.server.session import ServerSession -from mcp.server.validation import validate_sampling_tools, validate_tool_use_result_messages -from mcp.shared.exceptions import MCPError -from mcp.shared.experimental.tasks.capabilities import ( - require_task_augmented_elicitation, - require_task_augmented_sampling, -) -from mcp.shared.experimental.tasks.context import TaskContext -from mcp.shared.experimental.tasks.message_queue import QueuedMessage, TaskMessageQueue -from mcp.shared.experimental.tasks.resolver import Resolver -from mcp.shared.experimental.tasks.store import TaskStore -from mcp.types import ( +from mcp_types import ( INVALID_REQUEST, TASK_STATUS_INPUT_REQUIRED, TASK_STATUS_WORKING, @@ -46,6 +33,19 @@ ToolChoice, ) +from mcp.server.experimental.task_result_handler import TaskResultHandler +from mcp.server.session import ServerSession +from mcp.server.validation import validate_sampling_tools, validate_tool_use_result_messages +from mcp.shared.exceptions import MCPError +from mcp.shared.experimental.tasks.capabilities import ( + require_task_augmented_elicitation, + require_task_augmented_sampling, +) +from mcp.shared.experimental.tasks.context import TaskContext +from mcp.shared.experimental.tasks.message_queue import QueuedMessage, TaskMessageQueue +from mcp.shared.experimental.tasks.resolver import Resolver +from mcp.shared.experimental.tasks.store import TaskStore + class ServerTaskContext: """Server-integrated task context with elicitation and sampling. diff --git a/src/mcp/server/experimental/task_result_handler.py b/src/mcp/mcp/server/experimental/task_result_handler.py similarity index 99% rename from src/mcp/server/experimental/task_result_handler.py rename to src/mcp/mcp/server/experimental/task_result_handler.py index b2268bc1c8..d6af317de5 100644 --- a/src/mcp/server/experimental/task_result_handler.py +++ b/src/mcp/mcp/server/experimental/task_result_handler.py @@ -13,6 +13,14 @@ from typing import Any import anyio +from mcp_types import ( + INVALID_PARAMS, + ErrorData, + GetTaskPayloadRequest, + GetTaskPayloadResult, + RelatedTaskMetadata, + RequestId, +) from mcp.server.session import ServerSession from mcp.shared.exceptions import MCPError @@ -21,14 +29,6 @@ from mcp.shared.experimental.tasks.resolver import Resolver from mcp.shared.experimental.tasks.store import TaskStore from mcp.shared.message import ServerMessageMetadata, SessionMessage -from mcp.types import ( - INVALID_PARAMS, - ErrorData, - GetTaskPayloadRequest, - GetTaskPayloadResult, - RelatedTaskMetadata, - RequestId, -) logger = logging.getLogger(__name__) diff --git a/src/mcp/server/experimental/task_support.py b/src/mcp/mcp/server/experimental/task_support.py similarity index 100% rename from src/mcp/server/experimental/task_support.py rename to src/mcp/mcp/server/experimental/task_support.py diff --git a/src/mcp/server/lowlevel/__init__.py b/src/mcp/mcp/server/lowlevel/__init__.py similarity index 100% rename from src/mcp/server/lowlevel/__init__.py rename to src/mcp/mcp/server/lowlevel/__init__.py diff --git a/src/mcp/server/lowlevel/experimental.py b/src/mcp/mcp/server/lowlevel/experimental.py similarity index 99% rename from src/mcp/server/lowlevel/experimental.py rename to src/mcp/mcp/server/lowlevel/experimental.py index 5a907b6407..082ac272dd 100644 --- a/src/mcp/server/lowlevel/experimental.py +++ b/src/mcp/mcp/server/lowlevel/experimental.py @@ -9,16 +9,7 @@ from collections.abc import Awaitable, Callable from typing import Any, Generic -from typing_extensions import TypeVar - -from mcp.server.context import ServerRequestContext -from mcp.server.experimental.task_support import TaskSupport -from mcp.shared.exceptions import MCPError -from mcp.shared.experimental.tasks.helpers import cancel_task -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue, TaskMessageQueue -from mcp.shared.experimental.tasks.store import TaskStore -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, CancelTaskRequestParams, CancelTaskResult, @@ -37,6 +28,15 @@ TasksListCapability, TasksToolsCapability, ) +from typing_extensions import TypeVar + +from mcp.server.context import ServerRequestContext +from mcp.server.experimental.task_support import TaskSupport +from mcp.shared.exceptions import MCPError +from mcp.shared.experimental.tasks.helpers import cancel_task +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore +from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue, TaskMessageQueue +from mcp.shared.experimental.tasks.store import TaskStore logger = logging.getLogger(__name__) diff --git a/src/mcp/server/lowlevel/helper_types.py b/src/mcp/mcp/server/lowlevel/helper_types.py similarity index 100% rename from src/mcp/server/lowlevel/helper_types.py rename to src/mcp/mcp/server/lowlevel/helper_types.py diff --git a/src/mcp/server/lowlevel/server.py b/src/mcp/mcp/server/lowlevel/server.py similarity index 99% rename from src/mcp/server/lowlevel/server.py rename to src/mcp/mcp/server/lowlevel/server.py index 5e4e2e6f5b..c0f0984a4f 100644 --- a/src/mcp/server/lowlevel/server.py +++ b/src/mcp/mcp/server/lowlevel/server.py @@ -45,6 +45,7 @@ async def main(): from typing import Any, Generic, cast import anyio +import mcp_types as types from opentelemetry.trace import SpanKind, StatusCode from starlette.applications import Starlette from starlette.middleware import Middleware @@ -52,7 +53,6 @@ async def main(): from starlette.routing import Mount, Route from typing_extensions import TypeVar -from mcp import types from mcp.server.auth.middleware.auth_context import AuthContextMiddleware from mcp.server.auth.middleware.bearer_auth import BearerAuthBackend, RequireAuthMiddleware from mcp.server.auth.provider import OAuthAuthorizationServerProvider, TokenVerifier diff --git a/src/mcp/server/mcpserver/__init__.py b/src/mcp/mcp/server/mcpserver/__init__.py similarity index 89% rename from src/mcp/server/mcpserver/__init__.py rename to src/mcp/mcp/server/mcpserver/__init__.py index 0857e38bd4..e36a7ae7d6 100644 --- a/src/mcp/server/mcpserver/__init__.py +++ b/src/mcp/mcp/server/mcpserver/__init__.py @@ -1,6 +1,6 @@ """MCPServer - A more ergonomic interface for MCP servers.""" -from mcp.types import Icon +from mcp_types import Icon from .context import Context from .server import MCPServer diff --git a/src/mcp/server/mcpserver/context.py b/src/mcp/mcp/server/mcpserver/context.py similarity index 99% rename from src/mcp/server/mcpserver/context.py rename to src/mcp/mcp/server/mcpserver/context.py index 92de074d34..795c556469 100644 --- a/src/mcp/server/mcpserver/context.py +++ b/src/mcp/mcp/server/mcpserver/context.py @@ -3,6 +3,7 @@ from collections.abc import Iterable from typing import TYPE_CHECKING, Any, Generic +from mcp_types import LoggingLevel from pydantic import AnyUrl, BaseModel from mcp.server.context import LifespanContextT, RequestT, ServerRequestContext @@ -14,7 +15,6 @@ elicit_with_validation, ) from mcp.server.lowlevel.helper_types import ReadResourceContents -from mcp.types import LoggingLevel if TYPE_CHECKING: from mcp.server.mcpserver.server import MCPServer diff --git a/src/mcp/server/mcpserver/exceptions.py b/src/mcp/mcp/server/mcpserver/exceptions.py similarity index 100% rename from src/mcp/server/mcpserver/exceptions.py rename to src/mcp/mcp/server/mcpserver/exceptions.py diff --git a/src/mcp/server/mcpserver/prompts/__init__.py b/src/mcp/mcp/server/mcpserver/prompts/__init__.py similarity index 100% rename from src/mcp/server/mcpserver/prompts/__init__.py rename to src/mcp/mcp/server/mcpserver/prompts/__init__.py diff --git a/src/mcp/server/mcpserver/prompts/base.py b/src/mcp/mcp/server/mcpserver/prompts/base.py similarity index 99% rename from src/mcp/server/mcpserver/prompts/base.py rename to src/mcp/mcp/server/mcpserver/prompts/base.py index 2f778eb514..338cb1f870 100644 --- a/src/mcp/server/mcpserver/prompts/base.py +++ b/src/mcp/mcp/server/mcpserver/prompts/base.py @@ -8,12 +8,12 @@ import anyio.to_thread import pydantic_core +from mcp_types import ContentBlock, Icon, TextContent from pydantic import BaseModel, Field, TypeAdapter, validate_call from mcp.server.mcpserver.utilities.context_injection import find_context_parameter, inject_context from mcp.server.mcpserver.utilities.func_metadata import func_metadata from mcp.shared._callable_inspection import is_async_callable -from mcp.types import ContentBlock, Icon, TextContent if TYPE_CHECKING: from mcp.server.context import LifespanContextT, RequestT diff --git a/src/mcp/server/mcpserver/prompts/manager.py b/src/mcp/mcp/server/mcpserver/prompts/manager.py similarity index 100% rename from src/mcp/server/mcpserver/prompts/manager.py rename to src/mcp/mcp/server/mcpserver/prompts/manager.py diff --git a/src/mcp/server/mcpserver/resources/__init__.py b/src/mcp/mcp/server/mcpserver/resources/__init__.py similarity index 100% rename from src/mcp/server/mcpserver/resources/__init__.py rename to src/mcp/mcp/server/mcpserver/resources/__init__.py diff --git a/src/mcp/server/mcpserver/resources/base.py b/src/mcp/mcp/server/mcpserver/resources/base.py similarity index 97% rename from src/mcp/server/mcpserver/resources/base.py rename to src/mcp/mcp/server/mcpserver/resources/base.py index d48e0695cb..f7bedf6cbe 100644 --- a/src/mcp/server/mcpserver/resources/base.py +++ b/src/mcp/mcp/server/mcpserver/resources/base.py @@ -3,6 +3,7 @@ import abc from typing import Any +from mcp_types import Annotations, Icon from pydantic import ( BaseModel, ConfigDict, @@ -11,8 +12,6 @@ field_validator, ) -from mcp.types import Annotations, Icon - class Resource(BaseModel, abc.ABC): """Base class for all resources.""" diff --git a/src/mcp/server/mcpserver/resources/resource_manager.py b/src/mcp/mcp/server/mcpserver/resources/resource_manager.py similarity index 98% rename from src/mcp/server/mcpserver/resources/resource_manager.py rename to src/mcp/mcp/server/mcpserver/resources/resource_manager.py index 766cf51aea..a7cc794eeb 100644 --- a/src/mcp/server/mcpserver/resources/resource_manager.py +++ b/src/mcp/mcp/server/mcpserver/resources/resource_manager.py @@ -5,12 +5,12 @@ from collections.abc import Callable from typing import TYPE_CHECKING, Any +from mcp_types import Annotations, Icon from pydantic import AnyUrl from mcp.server.mcpserver.resources.base import Resource from mcp.server.mcpserver.resources.templates import ResourceTemplate from mcp.server.mcpserver.utilities.logging import get_logger -from mcp.types import Annotations, Icon if TYPE_CHECKING: from mcp.server.context import LifespanContextT, RequestT diff --git a/src/mcp/server/mcpserver/resources/templates.py b/src/mcp/mcp/server/mcpserver/resources/templates.py similarity index 99% rename from src/mcp/server/mcpserver/resources/templates.py rename to src/mcp/mcp/server/mcpserver/resources/templates.py index f1ee29a37f..e9e6aea920 100644 --- a/src/mcp/server/mcpserver/resources/templates.py +++ b/src/mcp/mcp/server/mcpserver/resources/templates.py @@ -9,13 +9,13 @@ from urllib.parse import unquote import anyio.to_thread +from mcp_types import Annotations, Icon from pydantic import BaseModel, Field, validate_call from mcp.server.mcpserver.resources.types import FunctionResource, Resource from mcp.server.mcpserver.utilities.context_injection import find_context_parameter, inject_context from mcp.server.mcpserver.utilities.func_metadata import func_metadata from mcp.shared._callable_inspection import is_async_callable -from mcp.types import Annotations, Icon if TYPE_CHECKING: from mcp.server.context import LifespanContextT, RequestT diff --git a/src/mcp/server/mcpserver/resources/types.py b/src/mcp/mcp/server/mcpserver/resources/types.py similarity index 99% rename from src/mcp/server/mcpserver/resources/types.py rename to src/mcp/mcp/server/mcpserver/resources/types.py index d9e472e362..a25213e7bf 100644 --- a/src/mcp/server/mcpserver/resources/types.py +++ b/src/mcp/mcp/server/mcpserver/resources/types.py @@ -12,11 +12,11 @@ import httpx import pydantic import pydantic_core +from mcp_types import Annotations, Icon from pydantic import Field, ValidationInfo, validate_call from mcp.server.mcpserver.resources.base import Resource from mcp.shared._callable_inspection import is_async_callable -from mcp.types import Annotations, Icon class TextResource(Resource): diff --git a/src/mcp/server/mcpserver/server.py b/src/mcp/mcp/server/mcpserver/server.py similarity index 99% rename from src/mcp/server/mcpserver/server.py rename to src/mcp/mcp/server/mcpserver/server.py index ec2365810e..70ab9aaef0 100644 --- a/src/mcp/server/mcpserver/server.py +++ b/src/mcp/mcp/server/mcpserver/server.py @@ -12,6 +12,34 @@ import anyio import pydantic_core +from mcp_types import ( + Annotations, + BlobResourceContents, + CallToolRequestParams, + CallToolResult, + CompleteRequestParams, + CompleteResult, + Completion, + ContentBlock, + GetPromptRequestParams, + GetPromptResult, + Icon, + ListPromptsResult, + ListResourcesResult, + ListResourceTemplatesResult, + ListToolsResult, + PaginatedRequestParams, + ReadResourceRequestParams, + ReadResourceResult, + TextContent, + TextResourceContents, + ToolAnnotations, +) +from mcp_types import Prompt as MCPPrompt +from mcp_types import PromptArgument as MCPPromptArgument +from mcp_types import Resource as MCPResource +from mcp_types import ResourceTemplate as MCPResourceTemplate +from mcp_types import Tool as MCPTool from pydantic.networks import AnyUrl from pydantic_settings import BaseSettings, SettingsConfigDict from starlette.applications import Starlette @@ -43,34 +71,6 @@ from mcp.server.streamable_http_manager import StreamableHTTPSessionManager from mcp.server.transport_security import TransportSecuritySettings from mcp.shared.exceptions import MCPError -from mcp.types import ( - Annotations, - BlobResourceContents, - CallToolRequestParams, - CallToolResult, - CompleteRequestParams, - CompleteResult, - Completion, - ContentBlock, - GetPromptRequestParams, - GetPromptResult, - Icon, - ListPromptsResult, - ListResourcesResult, - ListResourceTemplatesResult, - ListToolsResult, - PaginatedRequestParams, - ReadResourceRequestParams, - ReadResourceResult, - TextContent, - TextResourceContents, - ToolAnnotations, -) -from mcp.types import Prompt as MCPPrompt -from mcp.types import PromptArgument as MCPPromptArgument -from mcp.types import Resource as MCPResource -from mcp.types import ResourceTemplate as MCPResourceTemplate -from mcp.types import Tool as MCPTool logger = get_logger(__name__) diff --git a/src/mcp/server/mcpserver/tools/__init__.py b/src/mcp/mcp/server/mcpserver/tools/__init__.py similarity index 100% rename from src/mcp/server/mcpserver/tools/__init__.py rename to src/mcp/mcp/server/mcpserver/tools/__init__.py diff --git a/src/mcp/server/mcpserver/tools/base.py b/src/mcp/mcp/server/mcpserver/tools/base.py similarity index 99% rename from src/mcp/server/mcpserver/tools/base.py rename to src/mcp/mcp/server/mcpserver/tools/base.py index 754313eb8a..0b927b5464 100644 --- a/src/mcp/server/mcpserver/tools/base.py +++ b/src/mcp/mcp/server/mcpserver/tools/base.py @@ -4,6 +4,7 @@ from functools import cached_property from typing import TYPE_CHECKING, Any +from mcp_types import Icon, ToolAnnotations from pydantic import BaseModel, Field from mcp.server.mcpserver.exceptions import ToolError @@ -12,7 +13,6 @@ from mcp.shared._callable_inspection import is_async_callable from mcp.shared.exceptions import UrlElicitationRequiredError from mcp.shared.tool_name_validation import validate_and_warn_tool_name -from mcp.types import Icon, ToolAnnotations if TYPE_CHECKING: from mcp.server.context import LifespanContextT, RequestT diff --git a/src/mcp/server/mcpserver/tools/tool_manager.py b/src/mcp/mcp/server/mcpserver/tools/tool_manager.py similarity index 98% rename from src/mcp/server/mcpserver/tools/tool_manager.py rename to src/mcp/mcp/server/mcpserver/tools/tool_manager.py index eef4911f9e..9e7910ea93 100644 --- a/src/mcp/server/mcpserver/tools/tool_manager.py +++ b/src/mcp/mcp/server/mcpserver/tools/tool_manager.py @@ -3,10 +3,11 @@ from collections.abc import Callable from typing import TYPE_CHECKING, Any +from mcp_types import Icon, ToolAnnotations + from mcp.server.mcpserver.exceptions import ToolError from mcp.server.mcpserver.tools.base import Tool from mcp.server.mcpserver.utilities.logging import get_logger -from mcp.types import Icon, ToolAnnotations if TYPE_CHECKING: from mcp.server.context import LifespanContextT, RequestT diff --git a/src/mcp/server/mcpserver/utilities/__init__.py b/src/mcp/mcp/server/mcpserver/utilities/__init__.py similarity index 100% rename from src/mcp/server/mcpserver/utilities/__init__.py rename to src/mcp/mcp/server/mcpserver/utilities/__init__.py diff --git a/src/mcp/server/mcpserver/utilities/context_injection.py b/src/mcp/mcp/server/mcpserver/utilities/context_injection.py similarity index 100% rename from src/mcp/server/mcpserver/utilities/context_injection.py rename to src/mcp/mcp/server/mcpserver/utilities/context_injection.py diff --git a/src/mcp/server/mcpserver/utilities/func_metadata.py b/src/mcp/mcp/server/mcpserver/utilities/func_metadata.py similarity index 99% rename from src/mcp/server/mcpserver/utilities/func_metadata.py rename to src/mcp/mcp/server/mcpserver/utilities/func_metadata.py index 4a76106371..7744416a44 100644 --- a/src/mcp/server/mcpserver/utilities/func_metadata.py +++ b/src/mcp/mcp/server/mcpserver/utilities/func_metadata.py @@ -9,6 +9,7 @@ import anyio import anyio.to_thread import pydantic_core +from mcp_types import CallToolResult, ContentBlock, TextContent from pydantic import BaseModel, ConfigDict, Field, PydanticUserError, WithJsonSchema, create_model from pydantic.fields import FieldInfo from pydantic.json_schema import GenerateJsonSchema, JsonSchemaWarningKind @@ -24,7 +25,6 @@ from mcp.server.mcpserver.exceptions import InvalidSignature from mcp.server.mcpserver.utilities.logging import get_logger from mcp.server.mcpserver.utilities.types import Audio, Image -from mcp.types import CallToolResult, ContentBlock, TextContent logger = get_logger(__name__) diff --git a/src/mcp/server/mcpserver/utilities/logging.py b/src/mcp/mcp/server/mcpserver/utilities/logging.py similarity index 100% rename from src/mcp/server/mcpserver/utilities/logging.py rename to src/mcp/mcp/server/mcpserver/utilities/logging.py diff --git a/src/mcp/server/mcpserver/utilities/types.py b/src/mcp/mcp/server/mcpserver/utilities/types.py similarity index 98% rename from src/mcp/server/mcpserver/utilities/types.py rename to src/mcp/mcp/server/mcpserver/utilities/types.py index f092b245a8..63f94d4cc7 100644 --- a/src/mcp/server/mcpserver/utilities/types.py +++ b/src/mcp/mcp/server/mcpserver/utilities/types.py @@ -3,7 +3,7 @@ import base64 from pathlib import Path -from mcp.types import AudioContent, ImageContent +from mcp_types import AudioContent, ImageContent class Image: diff --git a/src/mcp/server/models.py b/src/mcp/mcp/server/models.py similarity index 89% rename from src/mcp/server/models.py rename to src/mcp/mcp/server/models.py index 3861f42a7e..6b129165a1 100644 --- a/src/mcp/server/models.py +++ b/src/mcp/mcp/server/models.py @@ -2,10 +2,9 @@ and tools. """ +from mcp_types import Icon, ServerCapabilities from pydantic import BaseModel -from mcp.types import Icon, ServerCapabilities - class InitializationOptions(BaseModel): server_name: str diff --git a/src/mcp/server/session.py b/src/mcp/mcp/server/session.py similarity index 99% rename from src/mcp/server/session.py rename to src/mcp/mcp/server/session.py index fc2f97a9cb..4b38e57969 100644 --- a/src/mcp/server/session.py +++ b/src/mcp/mcp/server/session.py @@ -33,10 +33,10 @@ async def handle_list_prompts(ctx: RequestContext, params) -> ListPromptsResult: import anyio import anyio.lowlevel +import mcp_types as types from anyio.streams.memory import MemoryObjectReceiveStream from pydantic import AnyUrl, TypeAdapter -from mcp import types from mcp.server.experimental.session_features import ExperimentalServerSessionFeatures from mcp.server.models import InitializationOptions from mcp.server.validation import validate_sampling_tools, validate_tool_use_result_messages diff --git a/src/mcp/server/sse.py b/src/mcp/mcp/server/sse.py similarity index 99% rename from src/mcp/server/sse.py rename to src/mcp/mcp/server/sse.py index 05e948332b..4d02fc4a73 100644 --- a/src/mcp/server/sse.py +++ b/src/mcp/mcp/server/sse.py @@ -43,13 +43,13 @@ async def handle_sse(request): from uuid import UUID, uuid4 import anyio +import mcp_types as types from pydantic import ValidationError from sse_starlette import EventSourceResponse from starlette.requests import Request from starlette.responses import Response from starlette.types import Receive, Scope, Send -from mcp import types from mcp.server.auth.middleware.bearer_auth import AuthenticatedUser, AuthorizationContext, authorization_context from mcp.server.transport_security import ( TransportSecurityMiddleware, diff --git a/src/mcp/server/stdio.py b/src/mcp/mcp/server/stdio.py similarity index 99% rename from src/mcp/server/stdio.py rename to src/mcp/mcp/server/stdio.py index 5c1459dff6..876d256ddb 100644 --- a/src/mcp/server/stdio.py +++ b/src/mcp/mcp/server/stdio.py @@ -23,8 +23,8 @@ async def run_server(): import anyio import anyio.lowlevel +import mcp_types as types -from mcp import types from mcp.shared._context_streams import create_context_streams from mcp.shared.message import SessionMessage diff --git a/src/mcp/server/streamable_http.py b/src/mcp/mcp/server/streamable_http.py similarity index 99% rename from src/mcp/server/streamable_http.py rename to src/mcp/mcp/server/streamable_http.py index f2f4407cea..882f3af511 100644 --- a/src/mcp/server/streamable_http.py +++ b/src/mcp/mcp/server/streamable_http.py @@ -18,18 +18,7 @@ import anyio import pydantic_core from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream -from pydantic import ValidationError -from sse_starlette import EventSourceResponse -from starlette.requests import Request -from starlette.responses import Response -from starlette.types import Receive, Scope, Send - -from mcp.server.transport_security import TransportSecurityMiddleware, TransportSecuritySettings -from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams -from mcp.shared._stream_protocols import ReadStream, WriteStream -from mcp.shared.message import ServerMessageMetadata, SessionMessage -from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS -from mcp.types import ( +from mcp_types import ( DEFAULT_NEGOTIATED_VERSION, INTERNAL_ERROR, INVALID_PARAMS, @@ -43,6 +32,17 @@ RequestId, jsonrpc_message_adapter, ) +from pydantic import ValidationError +from sse_starlette import EventSourceResponse +from starlette.requests import Request +from starlette.responses import Response +from starlette.types import Receive, Scope, Send + +from mcp.server.transport_security import TransportSecurityMiddleware, TransportSecuritySettings +from mcp.shared._context_streams import ContextReceiveStream, ContextSendStream, create_context_streams +from mcp.shared._stream_protocols import ReadStream, WriteStream +from mcp.shared.message import ServerMessageMetadata, SessionMessage +from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS logger = logging.getLogger(__name__) diff --git a/src/mcp/server/streamable_http_manager.py b/src/mcp/mcp/server/streamable_http_manager.py similarity index 99% rename from src/mcp/server/streamable_http_manager.py rename to src/mcp/mcp/server/streamable_http_manager.py index 81350a8f24..07ef4956ad 100644 --- a/src/mcp/server/streamable_http_manager.py +++ b/src/mcp/mcp/server/streamable_http_manager.py @@ -10,6 +10,7 @@ import anyio from anyio.abc import TaskStatus +from mcp_types import INVALID_REQUEST, ErrorData, JSONRPCError from starlette.requests import Request from starlette.responses import Response from starlette.types import Receive, Scope, Send @@ -21,7 +22,6 @@ StreamableHTTPServerTransport, ) from mcp.server.transport_security import TransportSecuritySettings -from mcp.types import INVALID_REQUEST, ErrorData, JSONRPCError if TYPE_CHECKING: from mcp.server.lowlevel.server import Server diff --git a/src/mcp/server/transport_security.py b/src/mcp/mcp/server/transport_security.py similarity index 100% rename from src/mcp/server/transport_security.py rename to src/mcp/mcp/server/transport_security.py diff --git a/src/mcp/server/validation.py b/src/mcp/mcp/server/validation.py similarity index 98% rename from src/mcp/server/validation.py rename to src/mcp/mcp/server/validation.py index 5708628074..29dbb30f56 100644 --- a/src/mcp/server/validation.py +++ b/src/mcp/mcp/server/validation.py @@ -4,8 +4,9 @@ that is shared across normal and task-augmented code paths. """ +from mcp_types import INVALID_PARAMS, ClientCapabilities, SamplingMessage, Tool, ToolChoice + from mcp.shared.exceptions import MCPError -from mcp.types import INVALID_PARAMS, ClientCapabilities, SamplingMessage, Tool, ToolChoice def check_sampling_tools_capability(client_caps: ClientCapabilities | None) -> bool: diff --git a/src/mcp/server/websocket.py b/src/mcp/mcp/server/websocket.py similarity index 98% rename from src/mcp/server/websocket.py rename to src/mcp/mcp/server/websocket.py index 277f9b5af2..979c803012 100644 --- a/src/mcp/server/websocket.py +++ b/src/mcp/mcp/server/websocket.py @@ -1,11 +1,11 @@ from contextlib import asynccontextmanager import anyio +import mcp_types as types from pydantic_core import ValidationError from starlette.types import Receive, Scope, Send from starlette.websockets import WebSocket -from mcp import types from mcp.shared._context_streams import create_context_streams from mcp.shared.message import SessionMessage diff --git a/src/mcp/mcp/shared/__init__.py b/src/mcp/mcp/shared/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/mcp/shared/_callable_inspection.py b/src/mcp/mcp/shared/_callable_inspection.py similarity index 100% rename from src/mcp/shared/_callable_inspection.py rename to src/mcp/mcp/shared/_callable_inspection.py diff --git a/src/mcp/shared/_context.py b/src/mcp/mcp/shared/_context.py similarity index 92% rename from src/mcp/shared/_context.py rename to src/mcp/mcp/shared/_context.py index bbcee2d02c..877c48143e 100644 --- a/src/mcp/shared/_context.py +++ b/src/mcp/mcp/shared/_context.py @@ -3,10 +3,10 @@ from dataclasses import dataclass from typing import Any, Generic +from mcp_types import RequestId, RequestParamsMeta from typing_extensions import TypeVar from mcp.shared.session import BaseSession -from mcp.types import RequestId, RequestParamsMeta SessionT = TypeVar("SessionT", bound=BaseSession[Any, Any, Any, Any, Any]) diff --git a/src/mcp/shared/_context_streams.py b/src/mcp/mcp/shared/_context_streams.py similarity index 100% rename from src/mcp/shared/_context_streams.py rename to src/mcp/mcp/shared/_context_streams.py diff --git a/src/mcp/shared/_httpx_utils.py b/src/mcp/mcp/shared/_httpx_utils.py similarity index 100% rename from src/mcp/shared/_httpx_utils.py rename to src/mcp/mcp/shared/_httpx_utils.py diff --git a/src/mcp/shared/_otel.py b/src/mcp/mcp/shared/_otel.py similarity index 100% rename from src/mcp/shared/_otel.py rename to src/mcp/mcp/shared/_otel.py diff --git a/src/mcp/shared/_stream_protocols.py b/src/mcp/mcp/shared/_stream_protocols.py similarity index 100% rename from src/mcp/shared/_stream_protocols.py rename to src/mcp/mcp/shared/_stream_protocols.py diff --git a/src/mcp/shared/auth.py b/src/mcp/mcp/shared/auth.py similarity index 100% rename from src/mcp/shared/auth.py rename to src/mcp/mcp/shared/auth.py diff --git a/src/mcp/shared/auth_utils.py b/src/mcp/mcp/shared/auth_utils.py similarity index 100% rename from src/mcp/shared/auth_utils.py rename to src/mcp/mcp/shared/auth_utils.py diff --git a/src/mcp/shared/exceptions.py b/src/mcp/mcp/shared/exceptions.py similarity index 98% rename from src/mcp/shared/exceptions.py rename to src/mcp/mcp/shared/exceptions.py index f153ea319d..7af8ff3873 100644 --- a/src/mcp/shared/exceptions.py +++ b/src/mcp/mcp/shared/exceptions.py @@ -2,7 +2,7 @@ from typing import Any, cast -from mcp.types import URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData, JSONRPCError +from mcp_types import URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData, JSONRPCError class MCPError(Exception): diff --git a/src/mcp/shared/experimental/__init__.py b/src/mcp/mcp/shared/experimental/__init__.py similarity index 100% rename from src/mcp/shared/experimental/__init__.py rename to src/mcp/mcp/shared/experimental/__init__.py diff --git a/src/mcp/shared/experimental/tasks/__init__.py b/src/mcp/mcp/shared/experimental/tasks/__init__.py similarity index 100% rename from src/mcp/shared/experimental/tasks/__init__.py rename to src/mcp/mcp/shared/experimental/tasks/__init__.py diff --git a/src/mcp/shared/experimental/tasks/capabilities.py b/src/mcp/mcp/shared/experimental/tasks/capabilities.py similarity index 98% rename from src/mcp/shared/experimental/tasks/capabilities.py rename to src/mcp/mcp/shared/experimental/tasks/capabilities.py index 51fe64ecc3..e2007d2700 100644 --- a/src/mcp/shared/experimental/tasks/capabilities.py +++ b/src/mcp/mcp/shared/experimental/tasks/capabilities.py @@ -7,8 +7,9 @@ WARNING: These APIs are experimental and may change without notice. """ +from mcp_types import INVALID_REQUEST, ClientCapabilities, ClientTasksCapability + from mcp.shared.exceptions import MCPError -from mcp.types import INVALID_REQUEST, ClientCapabilities, ClientTasksCapability def check_tasks_capability( diff --git a/src/mcp/shared/experimental/tasks/context.py b/src/mcp/mcp/shared/experimental/tasks/context.py similarity index 97% rename from src/mcp/shared/experimental/tasks/context.py rename to src/mcp/mcp/shared/experimental/tasks/context.py index ed0d2b91b6..a982951e71 100644 --- a/src/mcp/shared/experimental/tasks/context.py +++ b/src/mcp/mcp/shared/experimental/tasks/context.py @@ -5,8 +5,9 @@ workers or wrapped by ServerTaskContext for full server integration. """ +from mcp_types import TASK_STATUS_COMPLETED, TASK_STATUS_FAILED, Result, Task + from mcp.shared.experimental.tasks.store import TaskStore -from mcp.types import TASK_STATUS_COMPLETED, TASK_STATUS_FAILED, Result, Task class TaskContext: diff --git a/src/mcp/shared/experimental/tasks/helpers.py b/src/mcp/mcp/shared/experimental/tasks/helpers.py similarity index 99% rename from src/mcp/shared/experimental/tasks/helpers.py rename to src/mcp/mcp/shared/experimental/tasks/helpers.py index 3f91cd0d06..920975d3d0 100644 --- a/src/mcp/shared/experimental/tasks/helpers.py +++ b/src/mcp/mcp/shared/experimental/tasks/helpers.py @@ -9,10 +9,7 @@ from datetime import datetime, timezone from uuid import uuid4 -from mcp.shared.exceptions import MCPError -from mcp.shared.experimental.tasks.context import TaskContext -from mcp.shared.experimental.tasks.store import TaskStore -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, TASK_STATUS_CANCELLED, TASK_STATUS_COMPLETED, @@ -24,6 +21,10 @@ TaskStatus, ) +from mcp.shared.exceptions import MCPError +from mcp.shared.experimental.tasks.context import TaskContext +from mcp.shared.experimental.tasks.store import TaskStore + # Metadata key for model-immediate-response (per MCP spec) # Servers MAY include this in CreateTaskResult._meta to provide an immediate # response string while the task executes in the background. diff --git a/src/mcp/shared/experimental/tasks/in_memory_task_store.py b/src/mcp/mcp/shared/experimental/tasks/in_memory_task_store.py similarity index 99% rename from src/mcp/shared/experimental/tasks/in_memory_task_store.py rename to src/mcp/mcp/shared/experimental/tasks/in_memory_task_store.py index 42f4fb7035..72287a6dee 100644 --- a/src/mcp/shared/experimental/tasks/in_memory_task_store.py +++ b/src/mcp/mcp/shared/experimental/tasks/in_memory_task_store.py @@ -11,10 +11,10 @@ from datetime import datetime, timedelta, timezone import anyio +from mcp_types import Result, Task, TaskMetadata, TaskStatus from mcp.shared.experimental.tasks.helpers import create_task_state, is_terminal from mcp.shared.experimental.tasks.store import TaskStore -from mcp.types import Result, Task, TaskMetadata, TaskStatus @dataclass diff --git a/src/mcp/shared/experimental/tasks/message_queue.py b/src/mcp/mcp/shared/experimental/tasks/message_queue.py similarity index 99% rename from src/mcp/shared/experimental/tasks/message_queue.py rename to src/mcp/mcp/shared/experimental/tasks/message_queue.py index e17c4a8650..64bef47f6b 100644 --- a/src/mcp/shared/experimental/tasks/message_queue.py +++ b/src/mcp/mcp/shared/experimental/tasks/message_queue.py @@ -18,9 +18,9 @@ from typing import Any, Literal import anyio +from mcp_types import JSONRPCNotification, JSONRPCRequest, RequestId from mcp.shared.experimental.tasks.resolver import Resolver -from mcp.types import JSONRPCNotification, JSONRPCRequest, RequestId @dataclass diff --git a/src/mcp/shared/experimental/tasks/polling.py b/src/mcp/mcp/shared/experimental/tasks/polling.py similarity index 97% rename from src/mcp/shared/experimental/tasks/polling.py rename to src/mcp/mcp/shared/experimental/tasks/polling.py index e4e13b6640..50f39e1fbf 100644 --- a/src/mcp/shared/experimental/tasks/polling.py +++ b/src/mcp/mcp/shared/experimental/tasks/polling.py @@ -9,9 +9,9 @@ from collections.abc import AsyncIterator, Awaitable, Callable import anyio +from mcp_types import GetTaskResult from mcp.shared.experimental.tasks.helpers import is_terminal -from mcp.types import GetTaskResult async def poll_until_terminal( diff --git a/src/mcp/shared/experimental/tasks/resolver.py b/src/mcp/mcp/shared/experimental/tasks/resolver.py similarity index 100% rename from src/mcp/shared/experimental/tasks/resolver.py rename to src/mcp/mcp/shared/experimental/tasks/resolver.py diff --git a/src/mcp/shared/experimental/tasks/store.py b/src/mcp/mcp/shared/experimental/tasks/store.py similarity index 98% rename from src/mcp/shared/experimental/tasks/store.py rename to src/mcp/mcp/shared/experimental/tasks/store.py index 7de97d40ca..e4dae19327 100644 --- a/src/mcp/shared/experimental/tasks/store.py +++ b/src/mcp/mcp/shared/experimental/tasks/store.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod -from mcp.types import Result, Task, TaskMetadata, TaskStatus +from mcp_types import Result, Task, TaskMetadata, TaskStatus class TaskStore(ABC): diff --git a/src/mcp/shared/memory.py b/src/mcp/mcp/shared/memory.py similarity index 100% rename from src/mcp/shared/memory.py rename to src/mcp/mcp/shared/memory.py diff --git a/src/mcp/shared/message.py b/src/mcp/mcp/shared/message.py similarity index 97% rename from src/mcp/shared/message.py rename to src/mcp/mcp/shared/message.py index 1858eeac31..5bc30803d9 100644 --- a/src/mcp/shared/message.py +++ b/src/mcp/mcp/shared/message.py @@ -8,7 +8,7 @@ from dataclasses import dataclass from typing import Any -from mcp.types import JSONRPCMessage, RequestId +from mcp_types import JSONRPCMessage, RequestId ResumptionToken = str diff --git a/src/mcp/shared/metadata_utils.py b/src/mcp/mcp/shared/metadata_utils.py similarity index 96% rename from src/mcp/shared/metadata_utils.py rename to src/mcp/mcp/shared/metadata_utils.py index 6e4d33da0f..b646133477 100644 --- a/src/mcp/shared/metadata_utils.py +++ b/src/mcp/mcp/shared/metadata_utils.py @@ -4,7 +4,7 @@ human-readable names in user interfaces in a spec-compliant way. """ -from mcp.types import Implementation, Prompt, Resource, ResourceTemplate, Tool +from mcp_types import Implementation, Prompt, Resource, ResourceTemplate, Tool def get_display_name(obj: Tool | Resource | Prompt | ResourceTemplate | Implementation) -> str: diff --git a/src/mcp/shared/response_router.py b/src/mcp/mcp/shared/response_router.py similarity index 97% rename from src/mcp/shared/response_router.py rename to src/mcp/mcp/shared/response_router.py index fe24b016f1..04d817a1ce 100644 --- a/src/mcp/shared/response_router.py +++ b/src/mcp/mcp/shared/response_router.py @@ -15,7 +15,7 @@ from typing import Any, Protocol -from mcp.types import ErrorData, RequestId +from mcp_types import ErrorData, RequestId class ResponseRouter(Protocol): diff --git a/src/mcp/shared/session.py b/src/mcp/mcp/shared/session.py similarity index 99% rename from src/mcp/shared/session.py rename to src/mcp/mcp/shared/session.py index 9c72a23844..05d6290b46 100644 --- a/src/mcp/shared/session.py +++ b/src/mcp/mcp/shared/session.py @@ -9,16 +9,7 @@ import anyio from anyio.streams.memory import MemoryObjectSendStream -from opentelemetry.trace import SpanKind -from pydantic import BaseModel, TypeAdapter -from typing_extensions import Self - -from mcp.shared._otel import inject_trace_context, otel_span -from mcp.shared._stream_protocols import ReadStream, WriteStream -from mcp.shared.exceptions import MCPError -from mcp.shared.message import MessageMetadata, ServerMessageMetadata, SessionMessage -from mcp.shared.response_router import ResponseRouter -from mcp.types import ( +from mcp_types import ( CONNECTION_CLOSED, INVALID_PARAMS, REQUEST_TIMEOUT, @@ -38,6 +29,15 @@ ServerRequest, ServerResult, ) +from opentelemetry.trace import SpanKind +from pydantic import BaseModel, TypeAdapter +from typing_extensions import Self + +from mcp.shared._otel import inject_trace_context, otel_span +from mcp.shared._stream_protocols import ReadStream, WriteStream +from mcp.shared.exceptions import MCPError +from mcp.shared.message import MessageMetadata, ServerMessageMetadata, SessionMessage +from mcp.shared.response_router import ResponseRouter SendRequestT = TypeVar("SendRequestT", ClientRequest, ServerRequest) SendResultT = TypeVar("SendResultT", ClientResult, ServerResult) diff --git a/src/mcp/shared/tool_name_validation.py b/src/mcp/mcp/shared/tool_name_validation.py similarity index 100% rename from src/mcp/shared/tool_name_validation.py rename to src/mcp/mcp/shared/tool_name_validation.py diff --git a/src/mcp/shared/version.py b/src/mcp/mcp/shared/version.py similarity index 70% rename from src/mcp/shared/version.py rename to src/mcp/mcp/shared/version.py index d2a1e462d4..c6eff395f5 100644 --- a/src/mcp/shared/version.py +++ b/src/mcp/mcp/shared/version.py @@ -1,3 +1,3 @@ -from mcp.types import LATEST_PROTOCOL_VERSION +from mcp_types import LATEST_PROTOCOL_VERSION SUPPORTED_PROTOCOL_VERSIONS: list[str] = ["2024-11-05", "2025-03-26", "2025-06-18", LATEST_PROTOCOL_VERSION] diff --git a/src/mcp/pyproject.toml b/src/mcp/pyproject.toml new file mode 100644 index 0000000000..fb9fb322fc --- /dev/null +++ b/src/mcp/pyproject.toml @@ -0,0 +1,88 @@ +[build-system] +requires = ["hatchling", "hatch-fancy-pypi-readme", "uv-dynamic-versioning"] +build-backend = "hatchling.build" + +[tool.hatch.version] +source = "uv-dynamic-versioning" + +[tool.uv-dynamic-versioning] +vcs = "git" +style = "pep440" +bump = true + +[project] +name = "mcp" +dynamic = ["version", "dependencies", "readme"] +description = "Model Context Protocol SDK" +requires-python = ">=3.10" +authors = [{ name = "Model Context Protocol a Series of LF Projects, LLC." }] +maintainers = [ + { name = "David Soria Parra", email = "davidsp@anthropic.com" }, + { name = "Marcelo Trylesinski", email = "marcelotryle@gmail.com" }, + { name = "Max Isbey", email = "maxisbey@anthropic.com" }, + { name = "Felix Weinberger", email = "fweinberger@anthropic.com" }, +] +keywords = ["git", "mcp", "llm", "automation"] +license = { text = "MIT" } +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", +] + +[tool.hatch.metadata.hooks.uv-dynamic-versioning] +dependencies = [ + "anyio>=4.9", + "httpx>=0.27.1,<1.0.0", + "httpx-sse>=0.4", + "mcp-types=={{ version }}", + "pydantic>=2.12.0", + "starlette>=0.48.0; python_version >= '3.14'", + "starlette>=0.27; python_version < '3.14'", + "python-multipart>=0.0.9", + "sse-starlette>=3.0.0", + "pydantic-settings>=2.5.2", + "uvicorn>=0.31.1; sys_platform != 'emscripten'", + "jsonschema>=4.20.0", + "pywin32>=311; sys_platform == 'win32'", + "pyjwt[crypto]>=2.10.1", + "typing-extensions>=4.13.0", + "typing-inspection>=0.4.1", + "opentelemetry-api>=1.28.0", +] + +[project.optional-dependencies] +rich = ["rich>=13.9.4"] +cli = ["typer>=0.16.0", "python-dotenv>=1.0.0"] +ws = ["websockets>=15.0.1"] + +[project.scripts] +mcp = "mcp.cli:app [cli]" + +[project.urls] +Homepage = "https://modelcontextprotocol.io" +Documentation = "https://py.sdk.modelcontextprotocol.io/v2/" +Repository = "https://github.com/modelcontextprotocol/python-sdk" +Issues = "https://github.com/modelcontextprotocol/python-sdk/issues" + +[tool.hatch.build.targets.wheel] +packages = ["mcp"] + +[tool.hatch.build.targets.sdist] +include = ["/mcp"] + +[tool.hatch.build.targets.sdist.force-include] +"../../README.md" = "README.md" +"../../LICENSE" = "LICENSE" + +[tool.hatch.metadata.hooks.fancy-pypi-readme] +content-type = "text/markdown" + +[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] +path = "../../README.md" diff --git a/tests/client/conftest.py b/tests/client/conftest.py index 081e1d68ea..1fbee13c18 100644 --- a/tests/client/conftest.py +++ b/tests/client/conftest.py @@ -4,11 +4,11 @@ from unittest.mock import patch import pytest +from mcp_types import JSONRPCNotification, JSONRPCRequest import mcp.shared.memory from mcp.client._transport import WriteStream from mcp.shared.message import SessionMessage -from mcp.types import JSONRPCNotification, JSONRPCRequest class SpyMemoryObjectSendStream: diff --git a/tests/client/test_client.py b/tests/client/test_client.py index ac52a9024a..305f12a747 100644 --- a/tests/client/test_client.py +++ b/tests/client/test_client.py @@ -8,15 +8,10 @@ from unittest.mock import patch import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.client._memory import InMemoryTransport -from mcp.client.client import Client -from mcp.server import Server, ServerRequestContext -from mcp.server.mcpserver import MCPServer -from mcp.types import ( +from mcp_types import ( CallToolResult, EmptyResult, GetPromptResult, @@ -38,6 +33,12 @@ ToolsCapability, ) +from mcp import MCPError +from mcp.client._memory import InMemoryTransport +from mcp.client.client import Client +from mcp.server import Server, ServerRequestContext +from mcp.server.mcpserver import MCPServer + pytestmark = pytest.mark.anyio diff --git a/tests/client/test_http_unicode.py b/tests/client/test_http_unicode.py index cc2e14e469..5df3b3fae8 100644 --- a/tests/client/test_http_unicode.py +++ b/tests/client/test_http_unicode.py @@ -9,16 +9,16 @@ from collections.abc import AsyncGenerator, Generator from contextlib import asynccontextmanager +import mcp_types as types import pytest +from mcp_types import TextContent, Tool from starlette.applications import Starlette from starlette.routing import Mount -from mcp import types from mcp.client.session import ClientSession from mcp.client.streamable_http import streamable_http_client from mcp.server import Server, ServerRequestContext from mcp.server.streamable_http_manager import StreamableHTTPSessionManager -from mcp.types import TextContent, Tool from tests.test_helpers import wait_for_server # Test constants with various Unicode characters diff --git a/tests/client/test_list_methods_cursor.py b/tests/client/test_list_methods_cursor.py index f70fb9277d..ce9896413d 100644 --- a/tests/client/test_list_methods_cursor.py +++ b/tests/client/test_list_methods_cursor.py @@ -1,11 +1,12 @@ from collections.abc import Callable +import mcp_types as types import pytest +from mcp_types import ListToolsResult -from mcp import Client, types +from mcp import Client from mcp.server import Server, ServerRequestContext from mcp.server.mcpserver import MCPServer -from mcp.types import ListToolsResult from .conftest import StreamSpyCollection diff --git a/tests/client/test_list_roots_callback.py b/tests/client/test_list_roots_callback.py index be4b9a97b9..5033c199b9 100644 --- a/tests/client/test_list_roots_callback.py +++ b/tests/client/test_list_roots_callback.py @@ -1,11 +1,11 @@ import pytest +from mcp_types import ListRootsResult, Root, TextContent from pydantic import FileUrl from mcp import Client from mcp.client.session import ClientSession from mcp.server.mcpserver import Context, MCPServer from mcp.shared._context import RequestContext -from mcp.types import ListRootsResult, Root, TextContent @pytest.mark.anyio diff --git a/tests/client/test_logging_callback.py b/tests/client/test_logging_callback.py index 454c1d3382..7228196795 100644 --- a/tests/client/test_logging_callback.py +++ b/tests/client/test_logging_callback.py @@ -1,15 +1,16 @@ from typing import Literal +import mcp_types as types import pytest - -from mcp import Client, types -from mcp.server.mcpserver import Context, MCPServer -from mcp.shared.session import RequestResponder -from mcp.types import ( +from mcp_types import ( LoggingMessageNotificationParams, TextContent, ) +from mcp import Client +from mcp.server.mcpserver import Context, MCPServer +from mcp.shared.session import RequestResponder + class LoggingCollector: def __init__(self): diff --git a/tests/client/test_notification_response.py b/tests/client/test_notification_response.py index 69c8afeb84..2882106c84 100644 --- a/tests/client/test_notification_response.py +++ b/tests/client/test_notification_response.py @@ -7,16 +7,17 @@ import json import httpx +import mcp_types as types import pytest +from mcp_types import RootsListChangedNotification from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse, Response from starlette.routing import Route -from mcp import ClientSession, MCPError, types +from mcp import ClientSession, MCPError from mcp.client.streamable_http import streamable_http_client from mcp.shared.session import RequestResponder -from mcp.types import RootsListChangedNotification pytestmark = pytest.mark.anyio diff --git a/tests/client/test_output_schema_validation.py b/tests/client/test_output_schema_validation.py index d78197b5c3..60f6fadc0f 100644 --- a/tests/client/test_output_schema_validation.py +++ b/tests/client/test_output_schema_validation.py @@ -2,10 +2,7 @@ from typing import Any import pytest - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( CallToolRequestParams, CallToolResult, ListToolsResult, @@ -14,6 +11,9 @@ Tool, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext + def _make_server( tools: list[Tool], diff --git a/tests/client/test_resource_cleanup.py b/tests/client/test_resource_cleanup.py index c7bf8fafa4..7b974b1319 100644 --- a/tests/client/test_resource_cleanup.py +++ b/tests/client/test_resource_cleanup.py @@ -3,11 +3,11 @@ import anyio import pytest +from mcp_types import ClientNotification, ClientRequest, ClientResult, EmptyResult, ErrorData, PingRequest from pydantic import TypeAdapter from mcp.shared.message import SessionMessage from mcp.shared.session import BaseSession, RequestId, SendResultT -from mcp.types import ClientNotification, ClientRequest, ClientResult, EmptyResult, ErrorData, PingRequest @pytest.mark.anyio diff --git a/tests/client/test_sampling_callback.py b/tests/client/test_sampling_callback.py index 6efcac0a52..b8f39cff9b 100644 --- a/tests/client/test_sampling_callback.py +++ b/tests/client/test_sampling_callback.py @@ -1,10 +1,5 @@ import pytest - -from mcp import Client -from mcp.client.session import ClientSession -from mcp.server.mcpserver import Context, MCPServer -from mcp.shared._context import RequestContext -from mcp.types import ( +from mcp_types import ( CreateMessageRequestParams, CreateMessageResult, CreateMessageResultWithTools, @@ -13,6 +8,11 @@ ToolUseContent, ) +from mcp import Client +from mcp.client.session import ClientSession +from mcp.server.mcpserver import Context, MCPServer +from mcp.shared._context import RequestContext + @pytest.mark.anyio async def test_sampling_callback(): diff --git a/tests/client/test_session.py b/tests/client/test_session.py index f25c964f03..9c773e73cf 100644 --- a/tests/client/test_session.py +++ b/tests/client/test_session.py @@ -1,15 +1,9 @@ from __future__ import annotations import anyio +import mcp_types as types import pytest - -from mcp import types -from mcp.client.session import DEFAULT_CLIENT_INFO, ClientSession -from mcp.shared._context import RequestContext -from mcp.shared.message import SessionMessage -from mcp.shared.session import RequestResponder -from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS -from mcp.types import ( +from mcp_types import ( LATEST_PROTOCOL_VERSION, CallToolResult, Implementation, @@ -26,6 +20,12 @@ client_request_adapter, ) +from mcp.client.session import DEFAULT_CLIENT_INFO, ClientSession +from mcp.shared._context import RequestContext +from mcp.shared.message import SessionMessage +from mcp.shared.session import RequestResponder +from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS + @pytest.mark.anyio async def test_client_session_initialize(): diff --git a/tests/client/test_session_group.py b/tests/client/test_session_group.py index 6a58b39f39..6a2c5e0e75 100644 --- a/tests/client/test_session_group.py +++ b/tests/client/test_session_group.py @@ -2,10 +2,10 @@ from unittest import mock import httpx +import mcp_types as types import pytest import mcp -from mcp import types from mcp.client.session_group import ( ClientSessionGroup, ClientSessionParameters, diff --git a/tests/client/test_stdio.py b/tests/client/test_stdio.py index 06e2cba4b1..049f6312d6 100644 --- a/tests/client/test_stdio.py +++ b/tests/client/test_stdio.py @@ -8,6 +8,7 @@ import anyio import anyio.abc import pytest +from mcp_types import CONNECTION_CLOSED, JSONRPCMessage, JSONRPCRequest, JSONRPCResponse from mcp.client.session import ClientSession from mcp.client.stdio import ( @@ -19,7 +20,6 @@ from mcp.os.win32.utilities import FallbackProcess from mcp.shared.exceptions import MCPError from mcp.shared.message import SessionMessage -from mcp.types import CONNECTION_CLOSED, JSONRPCMessage, JSONRPCRequest, JSONRPCResponse # Timeout for cleanup of processes that ignore SIGTERM # This timeout ensures the test fails quickly if the cleanup logic doesn't have diff --git a/tests/client/transports/test_memory.py b/tests/client/transports/test_memory.py index c8fc41fd5d..03611969a1 100644 --- a/tests/client/transports/test_memory.py +++ b/tests/client/transports/test_memory.py @@ -1,12 +1,13 @@ """Tests for InMemoryTransport.""" +import mcp_types as types import pytest +from mcp_types import ListResourcesResult, Resource -from mcp import Client, types +from mcp import Client from mcp.client._memory import InMemoryTransport from mcp.server import Server, ServerRequestContext from mcp.server.mcpserver import MCPServer -from mcp.types import ListResourcesResult, Resource @pytest.fixture diff --git a/tests/experimental/tasks/client/test_capabilities.py b/tests/experimental/tasks/client/test_capabilities.py index 1ea2199e8c..eb8b49acb2 100644 --- a/tests/experimental/tasks/client/test_capabilities.py +++ b/tests/experimental/tasks/client/test_capabilities.py @@ -1,14 +1,9 @@ """Tests for client task capabilities declaration during initialization.""" import anyio +import mcp_types as types import pytest - -from mcp import ClientCapabilities, types -from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers -from mcp.client.session import ClientSession -from mcp.shared._context import RequestContext -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( LATEST_PROTOCOL_VERSION, Implementation, InitializeRequest, @@ -19,6 +14,12 @@ client_request_adapter, ) +from mcp import ClientCapabilities +from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers +from mcp.client.session import ClientSession +from mcp.shared._context import RequestContext +from mcp.shared.message import SessionMessage + @pytest.mark.anyio async def test_client_capabilities_without_tasks(): diff --git a/tests/experimental/tasks/client/test_handlers.py b/tests/experimental/tasks/client/test_handlers.py index 137ff80106..4ce8eaf3e8 100644 --- a/tests/experimental/tasks/client/test_handlers.py +++ b/tests/experimental/tasks/client/test_handlers.py @@ -14,19 +14,12 @@ from dataclasses import dataclass import anyio +import mcp_types as types import pytest from anyio import Event from anyio.abc import TaskGroup from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream - -from mcp import types -from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers -from mcp.client.session import ClientSession -from mcp.shared._context import RequestContext -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.shared.message import SessionMessage -from mcp.shared.session import RequestResponder -from mcp.types import ( +from mcp_types import ( CancelTaskRequest, CancelTaskRequestParams, CancelTaskResult, @@ -55,6 +48,13 @@ TextContent, ) +from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers +from mcp.client.session import ClientSession +from mcp.shared._context import RequestContext +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore +from mcp.shared.message import SessionMessage +from mcp.shared.session import RequestResponder + # Buffer size for test streams STREAM_BUFFER_SIZE = 10 diff --git a/tests/experimental/tasks/client/test_poll_task.py b/tests/experimental/tasks/client/test_poll_task.py index 5e3158d955..6b33a7d33b 100644 --- a/tests/experimental/tasks/client/test_poll_task.py +++ b/tests/experimental/tasks/client/test_poll_task.py @@ -6,9 +6,9 @@ from unittest.mock import AsyncMock import pytest +from mcp_types import GetTaskResult, TaskStatus from mcp.client.experimental.tasks import ExperimentalClientFeatures -from mcp.types import GetTaskResult, TaskStatus def make_task_result( diff --git a/tests/experimental/tasks/client/test_tasks.py b/tests/experimental/tasks/client/test_tasks.py index 613c794ebf..2652907646 100644 --- a/tests/experimental/tasks/client/test_tasks.py +++ b/tests/experimental/tasks/client/test_tasks.py @@ -8,12 +8,7 @@ import pytest from anyio import Event from anyio.abc import TaskGroup - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.shared.experimental.tasks.helpers import task_execution -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.types import ( +from mcp_types import ( CallToolRequest, CallToolRequestParams, CallToolResult, @@ -31,6 +26,11 @@ TextContent, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext +from mcp.shared.experimental.tasks.helpers import task_execution +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore + pytestmark = pytest.mark.anyio diff --git a/tests/experimental/tasks/server/test_context.py b/tests/experimental/tasks/server/test_context.py index a0f1a190d2..2e3be20657 100644 --- a/tests/experimental/tasks/server/test_context.py +++ b/tests/experimental/tasks/server/test_context.py @@ -1,11 +1,11 @@ """Tests for TaskContext and helper functions.""" import pytest +from mcp_types import CallToolResult, TaskMetadata, TextContent from mcp.shared.experimental.tasks.context import TaskContext from mcp.shared.experimental.tasks.helpers import create_task_state, task_execution from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.types import CallToolResult, TaskMetadata, TextContent @pytest.mark.anyio diff --git a/tests/experimental/tasks/server/test_integration.py b/tests/experimental/tasks/server/test_integration.py index b5b79033d0..3dbb8fc719 100644 --- a/tests/experimental/tasks/server/test_integration.py +++ b/tests/experimental/tasks/server/test_integration.py @@ -16,12 +16,7 @@ import pytest from anyio import Event from anyio.abc import TaskGroup - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.shared.experimental.tasks.helpers import task_execution -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.types import ( +from mcp_types import ( CallToolRequest, CallToolRequestParams, CallToolResult, @@ -37,6 +32,11 @@ TextContent, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext +from mcp.shared.experimental.tasks.helpers import task_execution +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore + pytestmark = pytest.mark.anyio diff --git a/tests/experimental/tasks/server/test_run_task_flow.py b/tests/experimental/tasks/server/test_run_task_flow.py index 027382e69e..629be6f50f 100644 --- a/tests/experimental/tasks/server/test_run_task_flow.py +++ b/tests/experimental/tasks/server/test_run_task_flow.py @@ -13,16 +13,7 @@ import anyio import pytest from anyio import Event - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.server.experimental.request_context import Experimental -from mcp.server.experimental.task_context import ServerTaskContext -from mcp.server.experimental.task_support import TaskSupport -from mcp.server.lowlevel import NotificationOptions -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue -from mcp.types import ( +from mcp_types import ( TASK_REQUIRED, CallToolRequestParams, CallToolResult, @@ -34,6 +25,15 @@ TextContent, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext +from mcp.server.experimental.request_context import Experimental +from mcp.server.experimental.task_context import ServerTaskContext +from mcp.server.experimental.task_support import TaskSupport +from mcp.server.lowlevel import NotificationOptions +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore +from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue + pytestmark = pytest.mark.anyio diff --git a/tests/experimental/tasks/server/test_server.py b/tests/experimental/tasks/server/test_server.py index 6a28b274ea..ebe6fa4b0b 100644 --- a/tests/experimental/tasks/server/test_server.py +++ b/tests/experimental/tasks/server/test_server.py @@ -5,18 +5,7 @@ import anyio import pytest - -from mcp import Client -from mcp.client.session import ClientSession -from mcp.server import Server, ServerRequestContext -from mcp.server.lowlevel import NotificationOptions -from mcp.server.models import InitializationOptions -from mcp.server.session import ServerSession -from mcp.shared.exceptions import MCPError -from mcp.shared.message import ServerMessageMetadata, SessionMessage -from mcp.shared.response_router import ResponseRouter -from mcp.shared.session import RequestResponder -from mcp.types import ( +from mcp_types import ( INVALID_REQUEST, TASK_FORBIDDEN, TASK_OPTIONAL, @@ -50,6 +39,17 @@ ToolExecution, ) +from mcp import Client +from mcp.client.session import ClientSession +from mcp.server import Server, ServerRequestContext +from mcp.server.lowlevel import NotificationOptions +from mcp.server.models import InitializationOptions +from mcp.server.session import ServerSession +from mcp.shared.exceptions import MCPError +from mcp.shared.message import ServerMessageMetadata, SessionMessage +from mcp.shared.response_router import ResponseRouter +from mcp.shared.session import RequestResponder + pytestmark = pytest.mark.anyio diff --git a/tests/experimental/tasks/server/test_server_task_context.py b/tests/experimental/tasks/server/test_server_task_context.py index e23299698c..6e693b3e7f 100644 --- a/tests/experimental/tasks/server/test_server_task_context.py +++ b/tests/experimental/tasks/server/test_server_task_context.py @@ -5,13 +5,7 @@ import anyio import pytest - -from mcp.server.experimental.task_context import ServerTaskContext -from mcp.server.experimental.task_result_handler import TaskResultHandler -from mcp.shared.exceptions import MCPError -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue -from mcp.types import ( +from mcp_types import ( CallToolResult, ClientCapabilities, ClientTasksCapability, @@ -28,6 +22,12 @@ TextContent, ) +from mcp.server.experimental.task_context import ServerTaskContext +from mcp.server.experimental.task_result_handler import TaskResultHandler +from mcp.shared.exceptions import MCPError +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore +from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue + @pytest.mark.anyio async def test_server_task_context_properties() -> None: diff --git a/tests/experimental/tasks/server/test_store.py b/tests/experimental/tasks/server/test_store.py index 0d431899c8..e4fc38f857 100644 --- a/tests/experimental/tasks/server/test_store.py +++ b/tests/experimental/tasks/server/test_store.py @@ -4,11 +4,11 @@ from datetime import datetime, timedelta, timezone import pytest +from mcp_types import INVALID_PARAMS, CallToolResult, TaskMetadata, TextContent from mcp.shared.exceptions import MCPError from mcp.shared.experimental.tasks.helpers import cancel_task from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.types import INVALID_PARAMS, CallToolResult, TaskMetadata, TextContent @pytest.fixture diff --git a/tests/experimental/tasks/server/test_task_result_handler.py b/tests/experimental/tasks/server/test_task_result_handler.py index 8b5a03ce2b..dc10e49116 100644 --- a/tests/experimental/tasks/server/test_task_result_handler.py +++ b/tests/experimental/tasks/server/test_task_result_handler.py @@ -6,14 +6,7 @@ import anyio import pytest - -from mcp.server.experimental.task_result_handler import TaskResultHandler -from mcp.shared.exceptions import MCPError -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue, QueuedMessage -from mcp.shared.experimental.tasks.resolver import Resolver -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( INVALID_REQUEST, CallToolResult, ErrorData, @@ -25,6 +18,13 @@ TextContent, ) +from mcp.server.experimental.task_result_handler import TaskResultHandler +from mcp.shared.exceptions import MCPError +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore +from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue, QueuedMessage +from mcp.shared.experimental.tasks.resolver import Resolver +from mcp.shared.message import SessionMessage + @pytest.fixture async def store() -> AsyncIterator[InMemoryTaskStore]: diff --git a/tests/experimental/tasks/test_capabilities.py b/tests/experimental/tasks/test_capabilities.py index 90a8656ba0..ce16d59bae 100644 --- a/tests/experimental/tasks/test_capabilities.py +++ b/tests/experimental/tasks/test_capabilities.py @@ -1,6 +1,15 @@ """Tests for tasks capability checking utilities.""" import pytest +from mcp_types import ( + ClientCapabilities, + ClientTasksCapability, + ClientTasksRequestsCapability, + TasksCreateElicitationCapability, + TasksCreateMessageCapability, + TasksElicitationCapability, + TasksSamplingCapability, +) from mcp import MCPError from mcp.shared.experimental.tasks.capabilities import ( @@ -10,15 +19,6 @@ require_task_augmented_elicitation, require_task_augmented_sampling, ) -from mcp.types import ( - ClientCapabilities, - ClientTasksCapability, - ClientTasksRequestsCapability, - TasksCreateElicitationCapability, - TasksCreateMessageCapability, - TasksElicitationCapability, - TasksSamplingCapability, -) class TestCheckTasksCapability: diff --git a/tests/experimental/tasks/test_elicitation_scenarios.py b/tests/experimental/tasks/test_elicitation_scenarios.py index 2d0378a9ce..db9ab4f521 100644 --- a/tests/experimental/tasks/test_elicitation_scenarios.py +++ b/tests/experimental/tasks/test_elicitation_scenarios.py @@ -14,17 +14,7 @@ import anyio import pytest from anyio import Event - -from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers -from mcp.client.session import ClientSession -from mcp.server import Server, ServerRequestContext -from mcp.server.experimental.task_context import ServerTaskContext -from mcp.server.lowlevel import NotificationOptions -from mcp.shared._context import RequestContext -from mcp.shared.experimental.tasks.helpers import is_terminal -from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( TASK_REQUIRED, CallToolRequestParams, CallToolResult, @@ -44,6 +34,16 @@ Tool, ) +from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers +from mcp.client.session import ClientSession +from mcp.server import Server, ServerRequestContext +from mcp.server.experimental.task_context import ServerTaskContext +from mcp.server.lowlevel import NotificationOptions +from mcp.shared._context import RequestContext +from mcp.shared.experimental.tasks.helpers import is_terminal +from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore +from mcp.shared.message import SessionMessage + def create_client_task_handlers( client_task_store: InMemoryTaskStore, diff --git a/tests/experimental/tasks/test_message_queue.py b/tests/experimental/tasks/test_message_queue.py index eca113d5b4..ffe3ae3688 100644 --- a/tests/experimental/tasks/test_message_queue.py +++ b/tests/experimental/tasks/test_message_queue.py @@ -5,10 +5,10 @@ import anyio import pytest +from mcp_types import JSONRPCNotification, JSONRPCRequest from mcp.shared.experimental.tasks.message_queue import InMemoryTaskMessageQueue, QueuedMessage from mcp.shared.experimental.tasks.resolver import Resolver -from mcp.types import JSONRPCNotification, JSONRPCRequest @pytest.fixture diff --git a/tests/experimental/tasks/test_request_context.py b/tests/experimental/tasks/test_request_context.py index ad4023389e..8eef0a8787 100644 --- a/tests/experimental/tasks/test_request_context.py +++ b/tests/experimental/tasks/test_request_context.py @@ -1,10 +1,7 @@ """Tests for the RequestContext.experimental (Experimental class) task validation helpers.""" import pytest - -from mcp.server.experimental.request_context import Experimental -from mcp.shared.exceptions import MCPError -from mcp.types import ( +from mcp_types import ( METHOD_NOT_FOUND, TASK_FORBIDDEN, TASK_OPTIONAL, @@ -16,6 +13,9 @@ ToolExecution, ) +from mcp.server.experimental.request_context import Experimental +from mcp.shared.exceptions import MCPError + def test_is_task_true_when_metadata_present() -> None: exp = Experimental(task_metadata=TaskMetadata(ttl=60000)) diff --git a/tests/experimental/tasks/test_spec_compliance.py b/tests/experimental/tasks/test_spec_compliance.py index 38d7d0a664..c860690e36 100644 --- a/tests/experimental/tasks/test_spec_compliance.py +++ b/tests/experimental/tasks/test_spec_compliance.py @@ -9,11 +9,7 @@ from datetime import datetime, timezone import pytest - -from mcp.server import Server, ServerRequestContext -from mcp.server.lowlevel import NotificationOptions -from mcp.shared.experimental.tasks.helpers import MODEL_IMMEDIATE_RESPONSE_KEY -from mcp.types import ( +from mcp_types import ( CancelTaskRequestParams, CancelTaskResult, CreateTaskResult, @@ -25,6 +21,10 @@ Task, ) +from mcp.server import Server, ServerRequestContext +from mcp.server.lowlevel import NotificationOptions +from mcp.shared.experimental.tasks.helpers import MODEL_IMMEDIATE_RESPONSE_KEY + # Shared test datetime TEST_DATETIME = datetime(2025, 1, 1, tzinfo=timezone.utc) diff --git a/tests/interaction/README.md b/tests/interaction/README.md index be68c3b0f1..5b79f5e562 100644 --- a/tests/interaction/README.md +++ b/tests/interaction/README.md @@ -24,7 +24,7 @@ flows — with a single subprocess test for stdio. rewrite preserved behaviour; a passing test that pins the wrong output exactly does. Known divergences are recorded as data on the requirement (see below), not worked around in the test. - **Spec-mandated assertions, not implementation quirks.** Error *codes* are asserted against - the constants in `mcp.types`; error *message strings* are pinned only where they are the + the constants in `mcp_types`; error *message strings* are pinned only where they are the SDK's own deliberate output. - **No sleeps, no real I/O.** Concurrency is coordinated with `anyio.Event`; every wait that could hang is bounded by `anyio.fail_after(5)`. The HTTP and OAuth tests drive the Starlette @@ -188,7 +188,7 @@ many requirements at once; if the assertions would be separate, write separate t |---|---| | the result of a transformation (arguments → output, exception → error result) | `result == snapshot(...)` of the full object, so any field the implementation adds or drops fails the test | | pass-through of an opaque value (`_meta`, cursors) | identity against the same variable that was sent — a snapshot of a pass-through value only matches the input because a human checked two literals correspond | -| an error | `pytest.raises(MCPError)` and a snapshot of `exc.value.error` when the message is the SDK's own; a plain `==` on `.code` against the `mcp.types` constant when it is not | +| an error | `pytest.raises(MCPError)` and a snapshot of `exc.value.error` when the message is the SDK's own; a plain `==` on `.code` against the `mcp_types` constant when it is not | | third-party output embedded in a result (validation messages) | the stable prefix only — never pin text that changes with a dependency upgrade | ### Notifications and concurrency diff --git a/tests/interaction/_connect.py b/tests/interaction/_connect.py index 1faf4aa8d6..fc07f2770e 100644 --- a/tests/interaction/_connect.py +++ b/tests/interaction/_connect.py @@ -13,6 +13,16 @@ import httpx from httpx_sse import ServerSentEvent, aconnect_sse +from mcp_types import ( + LATEST_PROTOCOL_VERSION, + ClientCapabilities, + Implementation, + InitializeRequestParams, + JSONRPCMessage, + JSONRPCRequest, + JSONRPCResponse, + jsonrpc_message_adapter, +) from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import Response @@ -30,16 +40,6 @@ from mcp.server.streamable_http import EventStore from mcp.server.streamable_http_manager import StreamableHTTPSessionManager from mcp.server.transport_security import TransportSecuritySettings -from mcp.types import ( - LATEST_PROTOCOL_VERSION, - ClientCapabilities, - Implementation, - InitializeRequestParams, - JSONRPCMessage, - JSONRPCRequest, - JSONRPCResponse, - jsonrpc_message_adapter, -) from tests.interaction.transports._bridge import StreamingASGITransport # The in-process app is mounted at this origin purely so URLs are well-formed; nothing listens here. diff --git a/tests/interaction/_helpers.py b/tests/interaction/_helpers.py index 25833b0ca5..72195757cc 100644 --- a/tests/interaction/_helpers.py +++ b/tests/interaction/_helpers.py @@ -9,12 +9,12 @@ from types import TracebackType import anyio +from mcp_types import ClientResult, ServerNotification, ServerRequest from typing_extensions import Self from mcp.client._transport import ReadStream, Transport, TransportStreams, WriteStream from mcp.shared.message import SessionMessage from mcp.shared.session import RequestResponder -from mcp.types import ClientResult, ServerNotification, ServerRequest # TODO: this union is the parameter type of every client message handler (MessageHandlerFnT), # but the SDK does not export a name for it -- writing a correctly-typed handler requires diff --git a/tests/interaction/auth/test_authorize_token.py b/tests/interaction/auth/test_authorize_token.py index cb8524c097..2d742fdbbf 100644 --- a/tests/interaction/auth/test_authorize_token.py +++ b/tests/interaction/auth/test_authorize_token.py @@ -20,15 +20,15 @@ from urllib.parse import parse_qsl, quote, urlsplit import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import ListToolsResult, Tool from pydantic import AnyHttpUrl, AnyUrl -from mcp import types from mcp.client.auth import OAuthFlowError from mcp.server import Server, ServerRequestContext from mcp.shared.auth import OAuthClientInformationFull, OAuthMetadata -from mcp.types import ListToolsResult, Tool from tests.interaction._connect import BASE_URL from tests.interaction._requirements import requirement from tests.interaction.auth._harness import ( diff --git a/tests/interaction/auth/test_bearer.py b/tests/interaction/auth/test_bearer.py index 341a8e0db9..55029c9f43 100644 --- a/tests/interaction/auth/test_bearer.py +++ b/tests/interaction/auth/test_bearer.py @@ -13,10 +13,10 @@ import httpx import pytest from inline_snapshot import snapshot +from mcp_types import JSONRPCResponse from mcp.server import Server from mcp.server.auth.provider import AccessToken -from mcp.types import JSONRPCResponse from tests.interaction._connect import base_headers, initialize_body, mounted_app from tests.interaction._requirements import requirement from tests.interaction.auth._harness import StaticTokenVerifier, auth_settings diff --git a/tests/interaction/auth/test_discovery.py b/tests/interaction/auth/test_discovery.py index 68c33c8a2d..06e4f4497d 100644 --- a/tests/interaction/auth/test_discovery.py +++ b/tests/interaction/auth/test_discovery.py @@ -13,15 +13,15 @@ import json import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import ListToolsResult, Tool from pydantic import AnyHttpUrl -from mcp import types from mcp.client.auth import OAuthFlowError, OAuthRegistrationError from mcp.server import Server, ServerRequestContext from mcp.shared.auth import OAuthMetadata, ProtectedResourceMetadata -from mcp.types import ListToolsResult, Tool from tests.interaction._connect import BASE_URL, mounted_app from tests.interaction._requirements import requirement from tests.interaction.auth._harness import ( diff --git a/tests/interaction/auth/test_flow.py b/tests/interaction/auth/test_flow.py index 968fc5f980..849cc26f42 100644 --- a/tests/interaction/auth/test_flow.py +++ b/tests/interaction/auth/test_flow.py @@ -14,15 +14,15 @@ import anyio import httpx +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import CallToolResult, ListToolsResult, TextContent, Tool from pydantic import AnyUrl -from mcp import types from mcp.server import Server, ServerRequestContext from mcp.server.auth.middleware.auth_context import get_access_token from mcp.shared.auth import OAuthClientInformationFull -from mcp.types import CallToolResult, ListToolsResult, TextContent, Tool from tests.interaction._connect import BASE_URL from tests.interaction._requirements import requirement from tests.interaction.auth._harness import ( diff --git a/tests/interaction/auth/test_lifecycle.py b/tests/interaction/auth/test_lifecycle.py index aa552ae8a6..5a35c1eab0 100644 --- a/tests/interaction/auth/test_lifecycle.py +++ b/tests/interaction/auth/test_lifecycle.py @@ -11,15 +11,16 @@ from urllib.parse import parse_qsl, urlsplit import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import INTERNAL_ERROR, ListToolsResult, Tool from pydantic import AnyHttpUrl, AnyUrl -from mcp import MCPError, types +from mcp import MCPError from mcp.client.auth.extensions.client_credentials import ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider from mcp.server import Server, ServerRequestContext from mcp.shared.auth import OAuthClientInformationFull, OAuthMetadata -from mcp.types import INTERNAL_ERROR, ListToolsResult, Tool from tests.interaction._connect import BASE_URL from tests.interaction._requirements import requirement from tests.interaction.auth._harness import ( diff --git a/tests/interaction/lowlevel/test_cancellation.py b/tests/interaction/lowlevel/test_cancellation.py index 6f1454e58a..97276f2452 100644 --- a/tests/interaction/lowlevel/test_cancellation.py +++ b/tests/interaction/lowlevel/test_cancellation.py @@ -7,15 +7,10 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.client import ClientSession -from mcp.server import Server, ServerRequestContext -from mcp.shared.memory import MessageStream, create_client_server_memory_streams -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( CallToolResult, EmptyResult, ErrorData, @@ -28,6 +23,12 @@ ServerCapabilities, TextContent, ) + +from mcp import MCPError +from mcp.client import ClientSession +from mcp.server import Server, ServerRequestContext +from mcp.shared.memory import MessageStream, create_client_server_memory_streams +from mcp.shared.message import SessionMessage from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_completion.py b/tests/interaction/lowlevel/test_completion.py index 6a35404df3..95734555ec 100644 --- a/tests/interaction/lowlevel/test_completion.py +++ b/tests/interaction/lowlevel/test_completion.py @@ -1,11 +1,9 @@ """Completion interactions against the low-level Server, driven through the public Client API.""" +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, METHOD_NOT_FOUND, CompleteResult, @@ -14,6 +12,9 @@ PromptReference, ResourceTemplateReference, ) + +from mcp import MCPError +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_elicitation.py b/tests/interaction/lowlevel/test_elicitation.py index b8edf601d0..9223de2434 100644 --- a/tests/interaction/lowlevel/test_elicitation.py +++ b/tests/interaction/lowlevel/test_elicitation.py @@ -5,15 +5,10 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, UrlElicitationRequiredError, types -from mcp.client import ClientRequestContext, ClientSession -from mcp.server import Server, ServerRequestContext -from mcp.shared.memory import MessageStream, create_client_server_memory_streams -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( CallToolResult, ElicitCompleteNotification, ElicitCompleteNotificationParams, @@ -31,6 +26,12 @@ ServerCapabilities, TextContent, ) + +from mcp import MCPError, UrlElicitationRequiredError +from mcp.client import ClientRequestContext, ClientSession +from mcp.server import Server, ServerRequestContext +from mcp.shared.memory import MessageStream, create_client_server_memory_streams +from mcp.shared.message import SessionMessage from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_flows.py b/tests/interaction/lowlevel/test_flows.py index 8d96582341..df047d6081 100644 --- a/tests/interaction/lowlevel/test_flows.py +++ b/tests/interaction/lowlevel/test_flows.py @@ -9,14 +9,10 @@ from collections.abc import Awaitable, Callable import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, UrlElicitationRequiredError, types -from mcp.client import ClientRequestContext -from mcp.server import Server, ServerRequestContext -from mcp.server.session import ServerSession -from mcp.types import ( +from mcp_types import ( URL_ELICITATION_REQUIRED, CallToolResult, ElicitCompleteNotification, @@ -31,6 +27,11 @@ TextResourceContents, Tool, ) + +from mcp import MCPError, UrlElicitationRequiredError +from mcp.client import ClientRequestContext +from mcp.server import Server, ServerRequestContext +from mcp.server.session import ServerSession from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_initialize.py b/tests/interaction/lowlevel/test_initialize.py index 91adbf5611..6f403d63a4 100644 --- a/tests/interaction/lowlevel/test_initialize.py +++ b/tests/interaction/lowlevel/test_initialize.py @@ -8,16 +8,10 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.client import ClientRequestContext, ClientSession -from mcp.client._memory import InMemoryTransport -from mcp.server import Server, ServerRequestContext -from mcp.shared.memory import MessageStream, create_client_server_memory_streams -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, CallToolResult, ClientCapabilities, @@ -40,6 +34,13 @@ TextContent, ToolsCapability, ) + +from mcp import MCPError +from mcp.client import ClientRequestContext, ClientSession +from mcp.client._memory import InMemoryTransport +from mcp.server import Server, ServerRequestContext +from mcp.shared.memory import MessageStream, create_client_server_memory_streams +from mcp.shared.message import SessionMessage from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_list_changed.py b/tests/interaction/lowlevel/test_list_changed.py index a2f85eeacf..e7d497ba2d 100644 --- a/tests/interaction/lowlevel/test_list_changed.py +++ b/tests/interaction/lowlevel/test_list_changed.py @@ -15,18 +15,18 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( CallToolResult, PromptListChangedNotification, ResourceListChangedNotification, TextContent, ToolListChangedNotification, ) + +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_logging.py b/tests/interaction/lowlevel/test_logging.py index fba632ef4d..c739967296 100644 --- a/tests/interaction/lowlevel/test_logging.py +++ b/tests/interaction/lowlevel/test_logging.py @@ -9,12 +9,12 @@ assert after the request completes on every transport leg -- no events, no waiting. """ +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import CallToolResult, EmptyResult, LoggingMessageNotificationParams, TextContent -from mcp import types from mcp.server import Server, ServerRequestContext -from mcp.types import CallToolResult, EmptyResult, LoggingMessageNotificationParams, TextContent from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_meta.py b/tests/interaction/lowlevel/test_meta.py index a9e4f994d8..27cf25e30c 100644 --- a/tests/interaction/lowlevel/test_meta.py +++ b/tests/interaction/lowlevel/test_meta.py @@ -5,11 +5,11 @@ which also proves the SDK injected nothing alongside it. """ +import mcp_types as types import pytest +from mcp_types import CallToolResult, RequestParamsMeta, TextContent -from mcp import types from mcp.server import Server, ServerRequestContext -from mcp.types import CallToolResult, RequestParamsMeta, TextContent from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_pagination.py b/tests/interaction/lowlevel/test_pagination.py index 77db90401e..01bc0a99bd 100644 --- a/tests/interaction/lowlevel/test_pagination.py +++ b/tests/interaction/lowlevel/test_pagination.py @@ -5,12 +5,10 @@ pagination scheme. """ +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, ListPromptsResult, ListResourcesResult, @@ -21,6 +19,9 @@ ResourceTemplate, Tool, ) + +from mcp import MCPError +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_ping.py b/tests/interaction/lowlevel/test_ping.py index 797e20dc35..3e80241f0d 100644 --- a/tests/interaction/lowlevel/test_ping.py +++ b/tests/interaction/lowlevel/test_ping.py @@ -1,11 +1,11 @@ """Ping interactions against the low-level Server, driven through the public Client API.""" +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import CallToolResult, EmptyResult, TextContent -from mcp import types from mcp.server import Server, ServerRequestContext -from mcp.types import CallToolResult, EmptyResult, TextContent from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_progress.py b/tests/interaction/lowlevel/test_progress.py index 6350c33a33..e0e2d5f854 100644 --- a/tests/interaction/lowlevel/test_progress.py +++ b/tests/interaction/lowlevel/test_progress.py @@ -10,14 +10,14 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import CallToolResult, ProgressNotification, ProgressNotificationParams, ProgressToken, TextContent -from mcp import types from mcp.server import Server, ServerRequestContext from mcp.server.session import ServerSession from mcp.shared.session import ProgressFnT -from mcp.types import CallToolResult, ProgressNotification, ProgressNotificationParams, ProgressToken, TextContent from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_prompts.py b/tests/interaction/lowlevel/test_prompts.py index 868b82692c..eb19d4d60d 100644 --- a/tests/interaction/lowlevel/test_prompts.py +++ b/tests/interaction/lowlevel/test_prompts.py @@ -1,11 +1,9 @@ """Prompt interactions against the low-level Server, driven through the public Client API.""" +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, AudioContent, EmbeddedResource, @@ -20,6 +18,9 @@ TextContent, TextResourceContents, ) + +from mcp import MCPError +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_resources.py b/tests/interaction/lowlevel/test_resources.py index 4e369d3645..02791cdf51 100644 --- a/tests/interaction/lowlevel/test_resources.py +++ b/tests/interaction/lowlevel/test_resources.py @@ -3,12 +3,10 @@ import base64 import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( METHOD_NOT_FOUND, Annotations, BlobResourceContents, @@ -26,6 +24,9 @@ TextContent, TextResourceContents, ) + +from mcp import MCPError +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_roots.py b/tests/interaction/lowlevel/test_roots.py index 8149e0befb..83c95f14ee 100644 --- a/tests/interaction/lowlevel/test_roots.py +++ b/tests/interaction/lowlevel/test_roots.py @@ -1,14 +1,15 @@ """Roots interactions against the low-level Server, driven through the public Client API.""" import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import INTERNAL_ERROR, CallToolResult, ErrorData, ListRootsResult, Root, TextContent from pydantic import FileUrl -from mcp import MCPError, types +from mcp import MCPError from mcp.client import ClientRequestContext from mcp.server import Server, ServerRequestContext -from mcp.types import INTERNAL_ERROR, CallToolResult, ErrorData, ListRootsResult, Root, TextContent from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_sampling.py b/tests/interaction/lowlevel/test_sampling.py index 260e564192..41f92d7737 100644 --- a/tests/interaction/lowlevel/test_sampling.py +++ b/tests/interaction/lowlevel/test_sampling.py @@ -5,14 +5,11 @@ round-trips what it received back to the test through its tool result. """ +import mcp_types as types import pydantic import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.client import ClientRequestContext -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( AudioContent, CallToolResult, CreateMessageRequestParams, @@ -28,6 +25,10 @@ ToolResultContent, ToolUseContent, ) + +from mcp import MCPError +from mcp.client import ClientRequestContext +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_timeouts.py b/tests/interaction/lowlevel/test_timeouts.py index a9c83d641d..ca90f10b8d 100644 --- a/tests/interaction/lowlevel/test_timeouts.py +++ b/tests/interaction/lowlevel/test_timeouts.py @@ -7,13 +7,14 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import REQUEST_TIMEOUT, CallToolResult, ErrorData, TextContent -from mcp import MCPError, types +from mcp import MCPError from mcp.client.client import Client from mcp.server import Server, ServerRequestContext -from mcp.types import REQUEST_TIMEOUT, CallToolResult, ErrorData, TextContent from tests.interaction._requirements import requirement pytestmark = pytest.mark.anyio diff --git a/tests/interaction/lowlevel/test_tools.py b/tests/interaction/lowlevel/test_tools.py index e8053fbaa7..861dd75e44 100644 --- a/tests/interaction/lowlevel/test_tools.py +++ b/tests/interaction/lowlevel/test_tools.py @@ -1,12 +1,10 @@ """Tool interactions against the low-level Server, driven through the public Client API.""" import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, AudioContent, CallToolResult, @@ -21,6 +19,9 @@ Tool, ToolAnnotations, ) + +from mcp import MCPError +from mcp.server import Server, ServerRequestContext from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/lowlevel/test_wire.py b/tests/interaction/lowlevel/test_wire.py index 0f9c58aa7a..1b0d803aac 100644 --- a/tests/interaction/lowlevel/test_wire.py +++ b/tests/interaction/lowlevel/test_wire.py @@ -11,17 +11,10 @@ """ import anyio +import mcp_types as types import pytest from inline_snapshot import snapshot - -from mcp import MCPError, types -from mcp.client import ClientRequestContext, ClientSession -from mcp.client._memory import InMemoryTransport -from mcp.client.client import Client -from mcp.server import Server, ServerRequestContext -from mcp.shared.memory import create_client_server_memory_streams -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( CONNECTION_CLOSED, INVALID_PARAMS, CallToolRequest, @@ -36,6 +29,14 @@ ListRootsResult, TextContent, ) + +from mcp import MCPError +from mcp.client import ClientRequestContext, ClientSession +from mcp.client._memory import InMemoryTransport +from mcp.client.client import Client +from mcp.server import Server, ServerRequestContext +from mcp.shared.memory import create_client_server_memory_streams +from mcp.shared.message import SessionMessage from tests.interaction._helpers import RecordingTransport, _RecordingReadStream from tests.interaction._requirements import requirement diff --git a/tests/interaction/mcpserver/test_completion.py b/tests/interaction/mcpserver/test_completion.py index 7761066e94..3a5fd94d1c 100644 --- a/tests/interaction/mcpserver/test_completion.py +++ b/tests/interaction/mcpserver/test_completion.py @@ -1,9 +1,7 @@ """Completion behaviour against MCPServer, driven through the public Client API.""" import pytest - -from mcp.server.mcpserver import MCPServer -from mcp.types import ( +from mcp_types import ( Completion, CompletionArgument, CompletionContext, @@ -11,6 +9,8 @@ PromptReference, ResourceTemplateReference, ) + +from mcp.server.mcpserver import MCPServer from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/mcpserver/test_context.py b/tests/interaction/mcpserver/test_context.py index 26556fea7a..38ce516256 100644 --- a/tests/interaction/mcpserver/test_context.py +++ b/tests/interaction/mcpserver/test_context.py @@ -2,13 +2,7 @@ import pytest from inline_snapshot import snapshot -from pydantic import BaseModel - -from mcp import MCPError -from mcp.client import ClientRequestContext -from mcp.server.elicitation import AcceptedElicitation -from mcp.server.mcpserver import Context, MCPServer -from mcp.types import ( +from mcp_types import ( METHOD_NOT_FOUND, CallToolResult, ElicitRequestFormParams, @@ -20,6 +14,12 @@ LoggingMessageNotificationParams, TextContent, ) +from pydantic import BaseModel + +from mcp import MCPError +from mcp.client import ClientRequestContext +from mcp.server.elicitation import AcceptedElicitation +from mcp.server.mcpserver import Context, MCPServer from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/mcpserver/test_prompts.py b/tests/interaction/mcpserver/test_prompts.py index 2095f086d4..58c8b48c7f 100644 --- a/tests/interaction/mcpserver/test_prompts.py +++ b/tests/interaction/mcpserver/test_prompts.py @@ -2,10 +2,7 @@ import pytest from inline_snapshot import snapshot - -from mcp import MCPError -from mcp.server.mcpserver import MCPServer -from mcp.types import ( +from mcp_types import ( ErrorData, GetPromptResult, ListPromptsResult, @@ -14,6 +11,9 @@ PromptMessage, TextContent, ) + +from mcp import MCPError +from mcp.server.mcpserver import MCPServer from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/mcpserver/test_resources.py b/tests/interaction/mcpserver/test_resources.py index 57b0fdc86d..b89e26cc52 100644 --- a/tests/interaction/mcpserver/test_resources.py +++ b/tests/interaction/mcpserver/test_resources.py @@ -2,10 +2,7 @@ import pytest from inline_snapshot import snapshot - -from mcp import MCPError -from mcp.server.mcpserver import MCPServer -from mcp.types import ( +from mcp_types import ( ErrorData, ListResourcesResult, ListResourceTemplatesResult, @@ -14,6 +11,9 @@ ResourceTemplate, TextResourceContents, ) + +from mcp import MCPError +from mcp.server.mcpserver import MCPServer from tests.interaction._connect import Connect from tests.interaction._requirements import requirement diff --git a/tests/interaction/mcpserver/test_tools.py b/tests/interaction/mcpserver/test_tools.py index 05135c1286..4910c1552c 100644 --- a/tests/interaction/mcpserver/test_tools.py +++ b/tests/interaction/mcpserver/test_tools.py @@ -5,13 +5,7 @@ import pytest from inline_snapshot import snapshot -from pydantic import BaseModel, Field - -from mcp import MCPError -from mcp.server.mcpserver import Context, MCPServer -from mcp.server.mcpserver.exceptions import ToolError -from mcp.shared.exceptions import UrlElicitationRequiredError -from mcp.types import ( +from mcp_types import ( URL_ELICITATION_REQUIRED, CallToolResult, ElicitRequestURLParams, @@ -20,6 +14,12 @@ LoggingMessageNotificationParams, TextContent, ) +from pydantic import BaseModel, Field + +from mcp import MCPError +from mcp.server.mcpserver import Context, MCPServer +from mcp.server.mcpserver.exceptions import ToolError +from mcp.shared.exceptions import UrlElicitationRequiredError from tests.interaction._connect import Connect from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/interaction/transports/_event_store.py b/tests/interaction/transports/_event_store.py index 84d1a2646a..265c9a58f6 100644 --- a/tests/interaction/transports/_event_store.py +++ b/tests/interaction/transports/_event_store.py @@ -8,9 +8,9 @@ """ import anyio +from mcp_types import JSONRPCMessage from mcp.server.streamable_http import EventCallback, EventId, EventMessage, EventStore, StreamId -from mcp.types import JSONRPCMessage class SequencedEventStore(EventStore): diff --git a/tests/interaction/transports/_stdio_server.py b/tests/interaction/transports/_stdio_server.py index 5977cc3e99..7c0cf84c39 100644 --- a/tests/interaction/transports/_stdio_server.py +++ b/tests/interaction/transports/_stdio_server.py @@ -9,10 +9,7 @@ import sys import anyio - -from mcp.server import Server, ServerRequestContext -from mcp.server.stdio import stdio_server -from mcp.types import ( +from mcp_types import ( CallToolRequestParams, CallToolResult, EmptyResult, @@ -23,6 +20,9 @@ Tool, ) +from mcp.server import Server, ServerRequestContext +from mcp.server.stdio import stdio_server + async def list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult: return ListToolsResult( diff --git a/tests/interaction/transports/test_client_transport_http.py b/tests/interaction/transports/test_client_transport_http.py index 65ed03f1e4..c95b4b9362 100644 --- a/tests/interaction/transports/test_client_transport_http.py +++ b/tests/interaction/transports/test_client_transport_http.py @@ -10,15 +10,16 @@ import anyio import httpx +import mcp_types as types import pytest from inline_snapshot import snapshot +from mcp_types import INVALID_REQUEST, CallToolResult, ErrorData, ListToolsResult, TextContent, Tool from starlette.types import Receive, Scope, Send -from mcp import MCPError, types +from mcp import MCPError from mcp.client.client import Client from mcp.client.streamable_http import streamable_http_client from mcp.server import Server, ServerRequestContext -from mcp.types import INVALID_REQUEST, CallToolResult, ErrorData, ListToolsResult, TextContent, Tool from tests.interaction._connect import BASE_URL, NO_DNS_REBINDING_PROTECTION, client_via_http, mounted_app from tests.interaction._requirements import requirement from tests.interaction.transports._bridge import StreamingASGITransport diff --git a/tests/interaction/transports/test_flows.py b/tests/interaction/transports/test_flows.py index c428fe2d68..19d69018c3 100644 --- a/tests/interaction/transports/test_flows.py +++ b/tests/interaction/transports/test_flows.py @@ -9,10 +9,10 @@ import httpx import pytest from inline_snapshot import snapshot +from mcp_types import CallToolResult, LoggingMessageNotificationParams, TextContent from mcp.client.session import LoggingFnT from mcp.server.mcpserver import Context, MCPServer -from mcp.types import CallToolResult, LoggingMessageNotificationParams, TextContent from tests.interaction._connect import client_via_http, connect_over_sse, mounted_app from tests.interaction._requirements import requirement diff --git a/tests/interaction/transports/test_hosting_http.py b/tests/interaction/transports/test_hosting_http.py index 85e64ded42..75db5ca478 100644 --- a/tests/interaction/transports/test_hosting_http.py +++ b/tests/interaction/transports/test_hosting_http.py @@ -11,10 +11,7 @@ from anyio.lowlevel import checkpoint from httpx_sse import ServerSentEvent, aconnect_sse from inline_snapshot import snapshot - -from mcp.server import Server, ServerRequestContext -from mcp.server.transport_security import TransportSecuritySettings -from mcp.types import ( +from mcp_types import ( INVALID_PARAMS, PARSE_ERROR, CallToolRequestParams, @@ -31,6 +28,9 @@ SubscribeRequestParams, TextContent, ) + +from mcp.server import Server, ServerRequestContext +from mcp.server.transport_security import TransportSecuritySettings from tests.interaction._connect import ( base_headers, initialize_body, diff --git a/tests/interaction/transports/test_hosting_resume.py b/tests/interaction/transports/test_hosting_resume.py index c7945d56c3..c770f7b9e4 100644 --- a/tests/interaction/transports/test_hosting_resume.py +++ b/tests/interaction/transports/test_hosting_resume.py @@ -16,12 +16,7 @@ import pytest from httpx_sse import EventSource, ServerSentEvent from inline_snapshot import snapshot - -from mcp.client.session import ClientSession -from mcp.client.streamable_http import streamable_http_client -from mcp.server.mcpserver import Context, MCPServer -from mcp.shared.message import ClientMessageMetadata -from mcp.types import ( +from mcp_types import ( LATEST_PROTOCOL_VERSION, CallToolRequest, CallToolRequestParams, @@ -33,6 +28,11 @@ TextContent, jsonrpc_message_adapter, ) + +from mcp.client.session import ClientSession +from mcp.client.streamable_http import streamable_http_client +from mcp.server.mcpserver import Context, MCPServer +from mcp.shared.message import ClientMessageMetadata from tests.interaction._connect import ( BASE_URL, base_headers, diff --git a/tests/interaction/transports/test_hosting_session.py b/tests/interaction/transports/test_hosting_session.py index a926c3e8a2..1b41a4bee4 100644 --- a/tests/interaction/transports/test_hosting_session.py +++ b/tests/interaction/transports/test_hosting_session.py @@ -12,9 +12,9 @@ import httpx import pytest from inline_snapshot import snapshot +from mcp_types import JSONRPCResponse, ListToolsResult, PaginatedRequestParams, Tool from mcp.server import Server, ServerRequestContext -from mcp.types import JSONRPCResponse, ListToolsResult, PaginatedRequestParams, Tool from tests.interaction._connect import ( base_headers, client_via_http, diff --git a/tests/interaction/transports/test_sse.py b/tests/interaction/transports/test_sse.py index 9c7353dda5..801f7c5d0f 100644 --- a/tests/interaction/transports/test_sse.py +++ b/tests/interaction/transports/test_sse.py @@ -13,11 +13,11 @@ import httpx import pytest from inline_snapshot import snapshot +from mcp_types import EmptyResult from mcp.client.client import Client from mcp.client.sse import sse_client from mcp.server import Server -from mcp.types import EmptyResult from tests.interaction._connect import BASE_URL, build_sse_app from tests.interaction._requirements import requirement from tests.interaction.transports._bridge import StreamingASGITransport diff --git a/tests/interaction/transports/test_stdio.py b/tests/interaction/transports/test_stdio.py index 27cc65de42..099b70381b 100644 --- a/tests/interaction/transports/test_stdio.py +++ b/tests/interaction/transports/test_stdio.py @@ -25,12 +25,7 @@ import anyio import pytest from inline_snapshot import snapshot - -from mcp.client.client import Client -from mcp.client.stdio import StdioServerParameters, stdio_client -from mcp.server.stdio import stdio_server -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( CallToolResult, JSONRPCNotification, JSONRPCRequest, @@ -38,7 +33,12 @@ LoggingMessageNotificationParams, TextContent, ) -from mcp.types.jsonrpc import jsonrpc_message_adapter +from mcp_types.jsonrpc import jsonrpc_message_adapter + +from mcp.client.client import Client +from mcp.client.stdio import StdioServerParameters, stdio_client +from mcp.server.stdio import stdio_server +from mcp.shared.message import SessionMessage from tests.interaction._connect import initialize_body from tests.interaction._requirements import requirement from tests.interaction.transports import _stdio_server diff --git a/tests/interaction/transports/test_streamable_http.py b/tests/interaction/transports/test_streamable_http.py index d38e2a0bb3..3fdf1833cc 100644 --- a/tests/interaction/transports/test_streamable_http.py +++ b/tests/interaction/transports/test_streamable_http.py @@ -10,12 +10,7 @@ import anyio import pytest from inline_snapshot import snapshot -from pydantic import BaseModel - -from mcp.client import ClientRequestContext -from mcp.server.elicitation import AcceptedElicitation -from mcp.server.mcpserver import Context, MCPServer -from mcp.types import ( +from mcp_types import ( CallToolResult, ElicitRequestParams, ElicitResult, @@ -25,6 +20,11 @@ ResourceUpdatedNotificationParams, TextContent, ) +from pydantic import BaseModel + +from mcp.client import ClientRequestContext +from mcp.server.elicitation import AcceptedElicitation +from mcp.server.mcpserver import Context, MCPServer from tests.interaction._connect import connect_over_streamable_http from tests.interaction._helpers import IncomingMessage from tests.interaction._requirements import requirement diff --git a/tests/issues/test_1338_icons_and_metadata.py b/tests/issues/test_1338_icons_and_metadata.py index a003f75b8b..b91f655872 100644 --- a/tests/issues/test_1338_icons_and_metadata.py +++ b/tests/issues/test_1338_icons_and_metadata.py @@ -1,9 +1,9 @@ """Test icon and metadata support (SEP-973).""" import pytest +from mcp_types import Icon from mcp.server.mcpserver import MCPServer -from mcp.types import Icon pytestmark = pytest.mark.anyio diff --git a/tests/issues/test_141_resource_templates.py b/tests/issues/test_141_resource_templates.py index f5c5081c3c..e955ab0afb 100644 --- a/tests/issues/test_141_resource_templates.py +++ b/tests/issues/test_141_resource_templates.py @@ -1,12 +1,12 @@ import pytest +from mcp_types import ( + ListResourceTemplatesResult, + TextResourceContents, +) from mcp import Client from mcp.server.mcpserver import MCPServer from mcp.server.mcpserver.exceptions import ResourceError -from mcp.types import ( - ListResourceTemplatesResult, - TextResourceContents, -) @pytest.mark.anyio diff --git a/tests/issues/test_152_resource_mime_type.py b/tests/issues/test_152_resource_mime_type.py index 851e89979f..d1e76f7b7d 100644 --- a/tests/issues/test_152_resource_mime_type.py +++ b/tests/issues/test_152_resource_mime_type.py @@ -1,11 +1,8 @@ import base64 +import mcp_types as types import pytest - -from mcp import Client, types -from mcp.server import Server, ServerRequestContext -from mcp.server.mcpserver import MCPServer -from mcp.types import ( +from mcp_types import ( BlobResourceContents, ListResourcesResult, PaginatedRequestParams, @@ -14,6 +11,10 @@ TextResourceContents, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext +from mcp.server.mcpserver import MCPServer + pytestmark = pytest.mark.anyio diff --git a/tests/issues/test_1574_resource_uri_validation.py b/tests/issues/test_1574_resource_uri_validation.py index c677081282..856ecf0767 100644 --- a/tests/issues/test_1574_resource_uri_validation.py +++ b/tests/issues/test_1574_resource_uri_validation.py @@ -10,11 +10,9 @@ These tests verify the fix works end-to-end through the JSON-RPC protocol. """ +import mcp_types as types import pytest - -from mcp import Client, types -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( ListResourcesResult, PaginatedRequestParams, ReadResourceRequestParams, @@ -22,6 +20,9 @@ TextResourceContents, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext + pytestmark = pytest.mark.anyio diff --git a/tests/issues/test_192_request_id.py b/tests/issues/test_192_request_id.py index de96dbe23a..791b3f67ac 100644 --- a/tests/issues/test_192_request_id.py +++ b/tests/issues/test_192_request_id.py @@ -1,10 +1,6 @@ import anyio import pytest - -from mcp.server.lowlevel import NotificationOptions, Server -from mcp.server.models import InitializationOptions -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( LATEST_PROTOCOL_VERSION, ClientCapabilities, Implementation, @@ -16,6 +12,10 @@ NotificationParams, ) +from mcp.server.lowlevel import NotificationOptions, Server +from mcp.server.models import InitializationOptions +from mcp.shared.message import SessionMessage + @pytest.mark.anyio async def test_request_id_match() -> None: diff --git a/tests/issues/test_342_base64_encoding.py b/tests/issues/test_342_base64_encoding.py index 2bccedf8d2..71d9df42d2 100644 --- a/tests/issues/test_342_base64_encoding.py +++ b/tests/issues/test_342_base64_encoding.py @@ -7,10 +7,10 @@ import base64 import pytest +from mcp_types import BlobResourceContents from mcp import Client from mcp.server.mcpserver import MCPServer -from mcp.types import BlobResourceContents pytestmark = pytest.mark.anyio diff --git a/tests/issues/test_88_random_error.py b/tests/issues/test_88_random_error.py index 6b593d2a54..5ee60cc16a 100644 --- a/tests/issues/test_88_random_error.py +++ b/tests/issues/test_88_random_error.py @@ -3,16 +3,16 @@ from pathlib import Path import anyio +import mcp_types as types import pytest from anyio.abc import TaskStatus from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream +from mcp_types import CallToolRequestParams, CallToolResult, ListToolsResult, PaginatedRequestParams, TextContent -from mcp import types from mcp.client.session import ClientSession from mcp.server import Server, ServerRequestContext from mcp.shared.exceptions import MCPError from mcp.shared.message import SessionMessage -from mcp.types import CallToolRequestParams, CallToolResult, ListToolsResult, PaginatedRequestParams, TextContent @pytest.mark.anyio diff --git a/tests/issues/test_malformed_input.py b/tests/issues/test_malformed_input.py index da586f3098..89af9066ac 100644 --- a/tests/issues/test_malformed_input.py +++ b/tests/issues/test_malformed_input.py @@ -3,11 +3,11 @@ import anyio import pytest +from mcp_types import INVALID_PARAMS, JSONRPCError, JSONRPCMessage, JSONRPCRequest, ServerCapabilities from mcp.server.models import InitializationOptions from mcp.server.session import ServerSession from mcp.shared.message import SessionMessage -from mcp.types import INVALID_PARAMS, JSONRPCError, JSONRPCMessage, JSONRPCRequest, ServerCapabilities @pytest.mark.anyio diff --git a/tests/server/lowlevel/test_server_listing.py b/tests/server/lowlevel/test_server_listing.py index 2c3d303a92..6c70bf5f29 100644 --- a/tests/server/lowlevel/test_server_listing.py +++ b/tests/server/lowlevel/test_server_listing.py @@ -1,10 +1,7 @@ """Basic tests for list_prompts, list_resources, and list_tools handlers without pagination.""" import pytest - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( ListPromptsResult, ListResourcesResult, ListToolsResult, @@ -14,6 +11,9 @@ Tool, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext + @pytest.mark.anyio async def test_list_prompts_basic() -> None: diff --git a/tests/server/lowlevel/test_server_pagination.py b/tests/server/lowlevel/test_server_pagination.py index a4627b316d..e875a11775 100644 --- a/tests/server/lowlevel/test_server_pagination.py +++ b/tests/server/lowlevel/test_server_pagination.py @@ -1,14 +1,14 @@ import pytest - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( ListPromptsResult, ListResourcesResult, ListToolsResult, PaginatedRequestParams, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext + @pytest.mark.anyio async def test_list_prompts_pagination() -> None: diff --git a/tests/server/mcpserver/prompts/test_base.py b/tests/server/mcpserver/prompts/test_base.py index d4e4e6b5a6..ef795777ea 100644 --- a/tests/server/mcpserver/prompts/test_base.py +++ b/tests/server/mcpserver/prompts/test_base.py @@ -2,10 +2,10 @@ from typing import Any import pytest +from mcp_types import EmbeddedResource, TextContent, TextResourceContents from mcp.server.mcpserver import Context from mcp.server.mcpserver.prompts.base import AssistantMessage, Message, Prompt, UserMessage -from mcp.types import EmbeddedResource, TextContent, TextResourceContents class TestRenderPrompt: diff --git a/tests/server/mcpserver/prompts/test_manager.py b/tests/server/mcpserver/prompts/test_manager.py index 99a03db565..2389d198be 100644 --- a/tests/server/mcpserver/prompts/test_manager.py +++ b/tests/server/mcpserver/prompts/test_manager.py @@ -1,9 +1,9 @@ import pytest +from mcp_types import TextContent from mcp.server.mcpserver import Context from mcp.server.mcpserver.prompts.base import Prompt, UserMessage from mcp.server.mcpserver.prompts.manager import PromptManager -from mcp.types import TextContent class TestPromptManager: diff --git a/tests/server/mcpserver/resources/test_resource_template.py b/tests/server/mcpserver/resources/test_resource_template.py index 2a7ba8d503..470c4a3a3c 100644 --- a/tests/server/mcpserver/resources/test_resource_template.py +++ b/tests/server/mcpserver/resources/test_resource_template.py @@ -3,11 +3,11 @@ from typing import Any import pytest +from mcp_types import Annotations from pydantic import BaseModel from mcp.server.mcpserver import Context, MCPServer from mcp.server.mcpserver.resources import FunctionResource, ResourceTemplate -from mcp.types import Annotations class TestResourceTemplate: diff --git a/tests/server/mcpserver/resources/test_resources.py b/tests/server/mcpserver/resources/test_resources.py index 5d36beda85..744f483619 100644 --- a/tests/server/mcpserver/resources/test_resources.py +++ b/tests/server/mcpserver/resources/test_resources.py @@ -1,8 +1,8 @@ import pytest +from mcp_types import Annotations from mcp.server.mcpserver import MCPServer from mcp.server.mcpserver.resources import FunctionResource, Resource -from mcp.types import Annotations class TestResourceValidation: diff --git a/tests/server/mcpserver/test_elicitation.py b/tests/server/mcpserver/test_elicitation.py index 679fb848f5..6838772d16 100644 --- a/tests/server/mcpserver/test_elicitation.py +++ b/tests/server/mcpserver/test_elicitation.py @@ -2,14 +2,15 @@ from typing import Any +import mcp_types as types import pytest +from mcp_types import ElicitRequestParams, ElicitResult, TextContent from pydantic import BaseModel, Field -from mcp import Client, types +from mcp import Client from mcp.client.session import ClientSession, ElicitationFnT from mcp.server.mcpserver import Context, MCPServer from mcp.shared._context import RequestContext -from mcp.types import ElicitRequestParams, ElicitResult, TextContent # Shared schema for basic tests diff --git a/tests/server/mcpserver/test_func_metadata.py b/tests/server/mcpserver/test_func_metadata.py index c57d1ee9f0..8f477f4fd2 100644 --- a/tests/server/mcpserver/test_func_metadata.py +++ b/tests/server/mcpserver/test_func_metadata.py @@ -10,11 +10,11 @@ import annotated_types import pytest from dirty_equals import IsPartialDict +from mcp_types import CallToolResult from pydantic import BaseModel, Field from mcp.server.mcpserver.exceptions import InvalidSignature from mcp.server.mcpserver.utilities.func_metadata import func_metadata -from mcp.types import CallToolResult class SomeInputModelA(BaseModel): diff --git a/tests/server/mcpserver/test_integration.py b/tests/server/mcpserver/test_integration.py index f71c0574cd..a39adcfa12 100644 --- a/tests/server/mcpserver/test_integration.py +++ b/tests/server/mcpserver/test_integration.py @@ -13,24 +13,7 @@ import pytest from inline_snapshot import snapshot - -from examples.snippets.servers import ( - basic_prompt, - basic_resource, - basic_tool, - completion, - elicitation, - mcpserver_quickstart, - notifications, - sampling, - structured_output, - tool_progress, -) -from mcp.client import Client -from mcp.client.session import ClientSession -from mcp.shared._context import RequestContext -from mcp.shared.session import RequestResponder -from mcp.types import ( +from mcp_types import ( ClientResult, CreateMessageRequestParams, CreateMessageResult, @@ -53,6 +36,23 @@ ToolListChangedNotification, ) +from examples.snippets.servers import ( + basic_prompt, + basic_resource, + basic_tool, + completion, + elicitation, + mcpserver_quickstart, + notifications, + sampling, + structured_output, + tool_progress, +) +from mcp.client import Client +from mcp.client.session import ClientSession +from mcp.shared._context import RequestContext +from mcp.shared.session import RequestResponder + pytestmark = pytest.mark.anyio diff --git a/tests/server/mcpserver/test_server.py b/tests/server/mcpserver/test_server.py index 3457ec944a..b50d7ea886 100644 --- a/tests/server/mcpserver/test_server.py +++ b/tests/server/mcpserver/test_server.py @@ -5,21 +5,7 @@ import pytest from inline_snapshot import snapshot -from pydantic import BaseModel -from starlette.applications import Starlette -from starlette.routing import Mount, Route - -from mcp.client import Client -from mcp.server.context import ServerRequestContext -from mcp.server.experimental.request_context import Experimental -from mcp.server.mcpserver import Context, MCPServer -from mcp.server.mcpserver.exceptions import ToolError -from mcp.server.mcpserver.prompts.base import Message, UserMessage -from mcp.server.mcpserver.resources import FileResource, FunctionResource -from mcp.server.mcpserver.utilities.types import Audio, Image -from mcp.server.transport_security import TransportSecuritySettings -from mcp.shared.exceptions import MCPError -from mcp.types import ( +from mcp_types import ( AudioContent, BlobResourceContents, Completion, @@ -41,6 +27,20 @@ TextContent, TextResourceContents, ) +from pydantic import BaseModel +from starlette.applications import Starlette +from starlette.routing import Mount, Route + +from mcp.client import Client +from mcp.server.context import ServerRequestContext +from mcp.server.experimental.request_context import Experimental +from mcp.server.mcpserver import Context, MCPServer +from mcp.server.mcpserver.exceptions import ToolError +from mcp.server.mcpserver.prompts.base import Message, UserMessage +from mcp.server.mcpserver.resources import FileResource, FunctionResource +from mcp.server.mcpserver.utilities.types import Audio, Image +from mcp.server.transport_security import TransportSecuritySettings +from mcp.shared.exceptions import MCPError pytestmark = pytest.mark.anyio diff --git a/tests/server/mcpserver/test_title.py b/tests/server/mcpserver/test_title.py index 6624647572..c21786a5d3 100644 --- a/tests/server/mcpserver/test_title.py +++ b/tests/server/mcpserver/test_title.py @@ -1,12 +1,12 @@ """Integration tests for title field functionality.""" import pytest +from mcp_types import Prompt, Resource, ResourceTemplate, Tool, ToolAnnotations from mcp import Client from mcp.server.mcpserver import MCPServer from mcp.server.mcpserver.resources import FunctionResource from mcp.shared.metadata_utils import get_display_name -from mcp.types import Prompt, Resource, ResourceTemplate, Tool, ToolAnnotations @pytest.mark.anyio diff --git a/tests/server/mcpserver/test_tool_manager.py b/tests/server/mcpserver/test_tool_manager.py index e4dfd4ff9b..19fae8e1c1 100644 --- a/tests/server/mcpserver/test_tool_manager.py +++ b/tests/server/mcpserver/test_tool_manager.py @@ -4,6 +4,7 @@ from typing import Any, TypedDict import pytest +from mcp_types import TextContent, ToolAnnotations from pydantic import BaseModel from mcp.server.context import LifespanContextT, RequestT @@ -11,7 +12,6 @@ from mcp.server.mcpserver.exceptions import ToolError from mcp.server.mcpserver.tools import Tool, ToolManager from mcp.server.mcpserver.utilities.func_metadata import ArgModelBase, FuncMetadata -from mcp.types import TextContent, ToolAnnotations class TestAddTools: diff --git a/tests/server/mcpserver/test_url_elicitation.py b/tests/server/mcpserver/test_url_elicitation.py index af90dc208b..f412e3a113 100644 --- a/tests/server/mcpserver/test_url_elicitation.py +++ b/tests/server/mcpserver/test_url_elicitation.py @@ -1,15 +1,16 @@ """Test URL mode elicitation feature (SEP 1036).""" import anyio +import mcp_types as types import pytest +from mcp_types import ElicitRequestParams, ElicitResult, TextContent from pydantic import BaseModel, Field -from mcp import Client, types +from mcp import Client from mcp.client.session import ClientSession from mcp.server.elicitation import CancelledElicitation, DeclinedElicitation, elicit_url from mcp.server.mcpserver import Context, MCPServer from mcp.shared._context import RequestContext -from mcp.types import ElicitRequestParams, ElicitResult, TextContent @pytest.mark.anyio diff --git a/tests/server/mcpserver/test_url_elicitation_error_throw.py b/tests/server/mcpserver/test_url_elicitation_error_throw.py index 1f45fd60f0..29117e6936 100644 --- a/tests/server/mcpserver/test_url_elicitation_error_throw.py +++ b/tests/server/mcpserver/test_url_elicitation_error_throw.py @@ -1,9 +1,10 @@ """Test that UrlElicitationRequiredError is properly propagated as MCP error.""" +import mcp_types as types import pytest from inline_snapshot import snapshot -from mcp import Client, ErrorData, types +from mcp import Client, ErrorData from mcp.server.mcpserver import Context, MCPServer from mcp.shared.exceptions import MCPError, UrlElicitationRequiredError diff --git a/tests/server/test_cancel_handling.py b/tests/server/test_cancel_handling.py index cff5a37c15..c251f56917 100644 --- a/tests/server/test_cancel_handling.py +++ b/tests/server/test_cancel_handling.py @@ -2,12 +2,7 @@ import anyio import pytest - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.shared.exceptions import MCPError -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( LATEST_PROTOCOL_VERSION, CallToolRequest, CallToolRequestParams, @@ -25,6 +20,11 @@ Tool, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext +from mcp.shared.exceptions import MCPError +from mcp.shared.message import SessionMessage + @pytest.mark.anyio async def test_server_remains_functional_after_cancel(): diff --git a/tests/server/test_completion_with_context.py b/tests/server/test_completion_with_context.py index a01d0d4d72..cd9f5bed33 100644 --- a/tests/server/test_completion_with_context.py +++ b/tests/server/test_completion_with_context.py @@ -1,10 +1,7 @@ """Tests for completion handler with context functionality.""" import pytest - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( CompleteRequestParams, CompleteResult, Completion, @@ -12,6 +9,9 @@ ResourceTemplateReference, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext + @pytest.mark.anyio async def test_completion_handler_receives_context(): diff --git a/tests/server/test_lifespan.py b/tests/server/test_lifespan.py index 0d87905042..4cfff47c39 100644 --- a/tests/server/test_lifespan.py +++ b/tests/server/test_lifespan.py @@ -5,14 +5,7 @@ import anyio import pytest -from pydantic import TypeAdapter - -from mcp.server import ServerRequestContext -from mcp.server.lowlevel.server import NotificationOptions, Server -from mcp.server.mcpserver import Context, MCPServer -from mcp.server.models import InitializationOptions -from mcp.shared.message import SessionMessage -from mcp.types import ( +from mcp_types import ( CallToolRequestParams, CallToolResult, ClientCapabilities, @@ -24,6 +17,13 @@ JSONRPCResponse, TextContent, ) +from pydantic import TypeAdapter + +from mcp.server import ServerRequestContext +from mcp.server.lowlevel.server import NotificationOptions, Server +from mcp.server.mcpserver import Context, MCPServer +from mcp.server.models import InitializationOptions +from mcp.shared.message import SessionMessage @pytest.mark.anyio diff --git a/tests/server/test_lowlevel_exception_handling.py b/tests/server/test_lowlevel_exception_handling.py index 46925916d9..7e7e15f9d9 100644 --- a/tests/server/test_lowlevel_exception_handling.py +++ b/tests/server/test_lowlevel_exception_handling.py @@ -1,9 +1,9 @@ from unittest.mock import AsyncMock, Mock import anyio +import mcp_types as types import pytest -from mcp import types from mcp.server.lowlevel.server import Server from mcp.server.session import ServerSession from mcp.shared.message import SessionMessage diff --git a/tests/server/test_lowlevel_tool_annotations.py b/tests/server/test_lowlevel_tool_annotations.py index 705abdfe8c..f80ebd81ef 100644 --- a/tests/server/test_lowlevel_tool_annotations.py +++ b/tests/server/test_lowlevel_tool_annotations.py @@ -1,10 +1,10 @@ """Tests for tool annotations in low-level server.""" import pytest +from mcp_types import ListToolsResult, PaginatedRequestParams, Tool, ToolAnnotations from mcp import Client from mcp.server import Server, ServerRequestContext -from mcp.types import ListToolsResult, PaginatedRequestParams, Tool, ToolAnnotations @pytest.mark.anyio diff --git a/tests/server/test_read_resource.py b/tests/server/test_read_resource.py index 102a58d039..1ce8dac412 100644 --- a/tests/server/test_read_resource.py +++ b/tests/server/test_read_resource.py @@ -1,16 +1,16 @@ import base64 import pytest - -from mcp import Client -from mcp.server import Server, ServerRequestContext -from mcp.types import ( +from mcp_types import ( BlobResourceContents, ReadResourceRequestParams, ReadResourceResult, TextResourceContents, ) +from mcp import Client +from mcp.server import Server, ServerRequestContext + pytestmark = pytest.mark.anyio diff --git a/tests/server/test_session.py b/tests/server/test_session.py index a2786d865d..4922ee6714 100644 --- a/tests/server/test_session.py +++ b/tests/server/test_session.py @@ -1,9 +1,17 @@ from typing import Any import anyio +import mcp_types as types import pytest +from mcp_types import ( + ClientNotification, + CompletionsCapability, + InitializedNotification, + PromptsCapability, + ResourcesCapability, + ServerCapabilities, +) -from mcp import types from mcp.client.session import ClientSession from mcp.server import Server, ServerRequestContext from mcp.server.lowlevel import NotificationOptions @@ -12,14 +20,6 @@ from mcp.shared.exceptions import MCPError from mcp.shared.message import SessionMessage from mcp.shared.session import RequestResponder -from mcp.types import ( - ClientNotification, - CompletionsCapability, - InitializedNotification, - PromptsCapability, - ResourcesCapability, - ServerCapabilities, -) @pytest.mark.anyio diff --git a/tests/server/test_session_race_condition.py b/tests/server/test_session_race_condition.py index 81041152bc..3329202fa4 100644 --- a/tests/server/test_session_race_condition.py +++ b/tests/server/test_session_race_condition.py @@ -7,14 +7,14 @@ """ import anyio +import mcp_types as types import pytest +from mcp_types import ServerCapabilities, Tool -from mcp import types from mcp.server.models import InitializationOptions from mcp.server.session import ServerSession from mcp.shared.message import SessionMessage from mcp.shared.session import RequestResponder -from mcp.types import ServerCapabilities, Tool @pytest.mark.anyio diff --git a/tests/server/test_sse_security.py b/tests/server/test_sse_security.py index e95dc51b31..fb7c18e3c1 100644 --- a/tests/server/test_sse_security.py +++ b/tests/server/test_sse_security.py @@ -10,6 +10,7 @@ import pytest import sse_starlette.sse import uvicorn +from mcp_types import JSONRPCRequest, JSONRPCResponse, Tool from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import Response @@ -23,7 +24,6 @@ from mcp.server.transport_security import TransportSecuritySettings from mcp.shared._stream_protocols import WriteStream from mcp.shared.message import SessionMessage -from mcp.types import JSONRPCRequest, JSONRPCResponse, Tool from tests.test_helpers import wait_for_server logger = logging.getLogger(__name__) diff --git a/tests/server/test_stateless_mode.py b/tests/server/test_stateless_mode.py index 3bfc6e674c..1bd52abddb 100644 --- a/tests/server/test_stateless_mode.py +++ b/tests/server/test_stateless_mode.py @@ -11,14 +11,14 @@ from typing import Any import anyio +import mcp_types as types import pytest +from mcp_types import ServerCapabilities -from mcp import types from mcp.server.models import InitializationOptions from mcp.server.session import ServerSession from mcp.shared.exceptions import StatelessModeNotSupported from mcp.shared.message import SessionMessage -from mcp.types import ServerCapabilities @pytest.fixture diff --git a/tests/server/test_stdio.py b/tests/server/test_stdio.py index 677a993567..2a93c50a42 100644 --- a/tests/server/test_stdio.py +++ b/tests/server/test_stdio.py @@ -4,10 +4,10 @@ import anyio import pytest +from mcp_types import JSONRPCMessage, JSONRPCRequest, JSONRPCResponse, jsonrpc_message_adapter from mcp.server.stdio import stdio_server from mcp.shared.message import SessionMessage -from mcp.types import JSONRPCMessage, JSONRPCRequest, JSONRPCResponse, jsonrpc_message_adapter @pytest.mark.anyio diff --git a/tests/server/test_streamable_http_manager.py b/tests/server/test_streamable_http_manager.py index ba75547964..6b4e3524bb 100644 --- a/tests/server/test_streamable_http_manager.py +++ b/tests/server/test_streamable_http_manager.py @@ -8,6 +8,7 @@ import anyio import httpx import pytest +from mcp_types import INVALID_REQUEST, ListToolsResult, PaginatedRequestParams from starlette.types import Message, Scope from mcp import Client @@ -17,7 +18,6 @@ from mcp.server.auth.provider import AccessToken from mcp.server.streamable_http import MCP_SESSION_ID_HEADER, StreamableHTTPServerTransport from mcp.server.streamable_http_manager import StreamableHTTPSessionManager -from mcp.types import INVALID_REQUEST, ListToolsResult, PaginatedRequestParams @pytest.mark.anyio diff --git a/tests/server/test_streamable_http_security.py b/tests/server/test_streamable_http_security.py index 897555353e..4025958b28 100644 --- a/tests/server/test_streamable_http_security.py +++ b/tests/server/test_streamable_http_security.py @@ -8,6 +8,7 @@ import httpx import pytest import uvicorn +from mcp_types import Tool from starlette.applications import Starlette from starlette.routing import Mount from starlette.types import Receive, Scope, Send @@ -15,7 +16,6 @@ from mcp.server import Server from mcp.server.streamable_http_manager import StreamableHTTPSessionManager from mcp.server.transport_security import TransportSecuritySettings -from mcp.types import Tool from tests.test_helpers import wait_for_server SERVER_NAME = "test_streamable_http_security_server" diff --git a/tests/server/test_validation.py b/tests/server/test_validation.py index ad97dd3fd6..71476e844a 100644 --- a/tests/server/test_validation.py +++ b/tests/server/test_validation.py @@ -1,14 +1,7 @@ """Tests for server validation functions.""" import pytest - -from mcp.server.validation import ( - check_sampling_tools_capability, - validate_sampling_tools, - validate_tool_use_result_messages, -) -from mcp.shared.exceptions import MCPError -from mcp.types import ( +from mcp_types import ( ClientCapabilities, SamplingCapability, SamplingMessage, @@ -20,6 +13,13 @@ ToolUseContent, ) +from mcp.server.validation import ( + check_sampling_tools_capability, + validate_sampling_tools, + validate_tool_use_result_messages, +) +from mcp.shared.exceptions import MCPError + # Tests for check_sampling_tools_capability function diff --git a/tests/shared/test_exceptions.py b/tests/shared/test_exceptions.py index 9a7466264d..ab21ca2bdb 100644 --- a/tests/shared/test_exceptions.py +++ b/tests/shared/test_exceptions.py @@ -1,9 +1,9 @@ """Tests for MCP exception classes.""" import pytest +from mcp_types import URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData from mcp.shared.exceptions import MCPError, UrlElicitationRequiredError -from mcp.types import URL_ELICITATION_REQUIRED, ElicitRequestURLParams, ErrorData def test_url_elicitation_required_error_create_with_single_elicitation() -> None: diff --git a/tests/shared/test_otel.py b/tests/shared/test_otel.py index ec7ff78cc1..cc4d015647 100644 --- a/tests/shared/test_otel.py +++ b/tests/shared/test_otel.py @@ -1,9 +1,9 @@ from __future__ import annotations +import mcp_types as types import pytest from logfire.testing import CaptureLogfire -from mcp import types from mcp.client.client import Client from mcp.server.mcpserver import MCPServer diff --git a/tests/shared/test_progress_notifications.py b/tests/shared/test_progress_notifications.py index aad9e5d439..5b4befdd81 100644 --- a/tests/shared/test_progress_notifications.py +++ b/tests/shared/test_progress_notifications.py @@ -2,9 +2,10 @@ from unittest.mock import patch import anyio +import mcp_types as types import pytest -from mcp import Client, types +from mcp import Client from mcp.client.session import ClientSession from mcp.server import Server, ServerRequestContext from mcp.server.lowlevel import NotificationOptions diff --git a/tests/shared/test_session.py b/tests/shared/test_session.py index d7c6cc3b5f..17cb4143ce 100644 --- a/tests/shared/test_session.py +++ b/tests/shared/test_session.py @@ -1,14 +1,7 @@ import anyio +import mcp_types as types import pytest - -from mcp import Client, types -from mcp.client.session import ClientSession -from mcp.server import Server, ServerRequestContext -from mcp.shared.exceptions import MCPError -from mcp.shared.memory import create_client_server_memory_streams -from mcp.shared.message import SessionMessage -from mcp.shared.session import RequestResponder -from mcp.types import ( +from mcp_types import ( PARSE_ERROR, CancelledNotification, CancelledNotificationParams, @@ -22,6 +15,14 @@ ServerRequest, ) +from mcp import Client +from mcp.client.session import ClientSession +from mcp.server import Server, ServerRequestContext +from mcp.shared.exceptions import MCPError +from mcp.shared.memory import create_client_server_memory_streams +from mcp.shared.message import SessionMessage +from mcp.shared.session import RequestResponder + @pytest.mark.anyio async def test_in_flight_requests_cleared_after_completion(): diff --git a/tests/shared/test_sse.py b/tests/shared/test_sse.py index 5629a5707b..5482d3fc6b 100644 --- a/tests/shared/test_sse.py +++ b/tests/shared/test_sse.py @@ -8,24 +8,12 @@ import anyio import httpx +import mcp_types as types import pytest import uvicorn from httpx_sse import ServerSentEvent from inline_snapshot import snapshot -from starlette.applications import Starlette -from starlette.requests import Request -from starlette.responses import Response -from starlette.routing import Mount, Route - -import mcp.client.sse -from mcp import types -from mcp.client.session import ClientSession -from mcp.client.sse import _extract_session_id_from_endpoint, sse_client -from mcp.server import Server, ServerRequestContext -from mcp.server.sse import SseServerTransport -from mcp.server.transport_security import TransportSecuritySettings -from mcp.shared.exceptions import MCPError -from mcp.types import ( +from mcp_types import ( CallToolRequestParams, CallToolResult, EmptyResult, @@ -41,6 +29,18 @@ TextResourceContents, Tool, ) +from starlette.applications import Starlette +from starlette.requests import Request +from starlette.responses import Response +from starlette.routing import Mount, Route + +import mcp.client.sse +from mcp.client.session import ClientSession +from mcp.client.sse import _extract_session_id_from_endpoint, sse_client +from mcp.server import Server, ServerRequestContext +from mcp.server.sse import SseServerTransport +from mcp.server.transport_security import TransportSecuritySettings +from mcp.shared.exceptions import MCPError from tests.test_helpers import wait_for_server SERVER_NAME = "test_server_for_SSE" diff --git a/tests/shared/test_streamable_http.py b/tests/shared/test_streamable_http.py index 3d5770fb61..0e0b85915d 100644 --- a/tests/shared/test_streamable_http.py +++ b/tests/shared/test_streamable_http.py @@ -19,15 +19,29 @@ import anyio import httpx +import mcp_types as types import pytest import requests import uvicorn from httpx_sse import ServerSentEvent +from mcp_types import ( + CallToolRequestParams, + CallToolResult, + InitializeResult, + JSONRPCRequest, + ListToolsResult, + PaginatedRequestParams, + ReadResourceRequestParams, + ReadResourceResult, + TextContent, + TextResourceContents, + Tool, +) from starlette.applications import Starlette from starlette.requests import Request from starlette.routing import Mount -from mcp import MCPError, types +from mcp import MCPError from mcp.client.session import ClientSession from mcp.client.streamable_http import StreamableHTTPTransport, streamable_http_client from mcp.server import Server, ServerRequestContext @@ -53,19 +67,6 @@ ) from mcp.shared.message import ClientMessageMetadata, ServerMessageMetadata, SessionMessage from mcp.shared.session import RequestResponder -from mcp.types import ( - CallToolRequestParams, - CallToolResult, - InitializeResult, - JSONRPCRequest, - ListToolsResult, - PaginatedRequestParams, - ReadResourceRequestParams, - ReadResourceResult, - TextContent, - TextResourceContents, - Tool, -) from tests.test_helpers import wait_for_server # Test constants diff --git a/tests/shared/test_ws.py b/tests/shared/test_ws.py index 482dcdcf32..9bf4fcb423 100644 --- a/tests/shared/test_ws.py +++ b/tests/shared/test_ws.py @@ -9,6 +9,7 @@ from collections.abc import Generator import pytest +from mcp_types import EmptyResult, InitializeResult from starlette.applications import Starlette from starlette.routing import WebSocketRoute from starlette.websockets import WebSocket @@ -17,7 +18,6 @@ from mcp.client.websocket import websocket_client from mcp.server import Server from mcp.server.websocket import websocket_server -from mcp.types import EmptyResult, InitializeResult from tests.test_helpers import run_uvicorn_in_thread SERVER_NAME = "test_server_for_WS" diff --git a/tests/test_examples.py b/tests/test_examples.py index 3af82f04c5..41e22af9f4 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -9,10 +9,10 @@ import pytest from inline_snapshot import snapshot +from mcp_types import CallToolResult, TextContent, TextResourceContents from pytest_examples import CodeExample, EvalExample, find_examples from mcp import Client -from mcp.types import CallToolResult, TextContent, TextResourceContents @pytest.mark.anyio diff --git a/tests/test_types.py b/tests/test_types.py index f424efdbf7..d640ee6b23 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -1,8 +1,7 @@ from typing import Any import pytest - -from mcp.types import ( +from mcp_types import ( LATEST_PROTOCOL_VERSION, ClientCapabilities, CreateMessageRequestParams, diff --git a/uv.lock b/uv.lock index 5b72e97fce..ce18ad4589 100644 --- a/uv.lock +++ b/uv.lock @@ -27,6 +27,7 @@ members = [ "mcp-sse-polling-client", "mcp-sse-polling-demo", "mcp-structured-output-lowlevel", + "mcp-types", ] build-constraints = [ { name = "dunamai", specifier = "==1.26.1" }, @@ -42,6 +43,33 @@ build-constraints = [ { name = "uv-dynamic-versioning", specifier = "==0.14.0" }, ] +[manifest.dependency-groups] +dev = [ + { name = "coverage", extras = ["toml"], specifier = ">=7.10.7,<=7.13" }, + { name = "dirty-equals", specifier = ">=0.9.0" }, + { name = "inline-snapshot", specifier = ">=0.23.0" }, + { name = "logfire", specifier = ">=3.0.0" }, + { name = "mcp", extras = ["cli", "ws"], editable = "src/mcp" }, + { name = "pillow", specifier = ">=12.0" }, + { name = "pyright", specifier = ">=1.1.400" }, + { name = "pytest", specifier = ">=8.4.0" }, + { name = "pytest-examples", specifier = ">=0.0.14" }, + { name = "pytest-flakefinder", specifier = ">=1.1.0" }, + { name = "pytest-pretty", specifier = ">=1.2.0" }, + { name = "pytest-xdist", specifier = ">=3.6.1" }, + { name = "ruff", specifier = ">=0.8.5" }, + { name = "strict-no-cover", git = "https://github.com/pydantic/strict-no-cover" }, + { name = "trio", specifier = ">=0.26.2" }, +] +docs = [ + { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-gen-files", specifier = ">=0.5.0" }, + { name = "mkdocs-glightbox", specifier = ">=0.4.0" }, + { name = "mkdocs-literate-nav", specifier = ">=0.6.1" }, + { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.5.45" }, + { name = "mkdocstrings-python", specifier = ">=2.0.1" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -847,12 +875,13 @@ wheels = [ [[package]] name = "mcp" -source = { editable = "." } +source = { editable = "src/mcp" } dependencies = [ { name = "anyio" }, { name = "httpx" }, { name = "httpx-sse" }, { name = "jsonschema" }, + { name = "mcp-types" }, { name = "opentelemetry-api" }, { name = "pydantic" }, { name = "pydantic-settings" }, @@ -878,39 +907,13 @@ ws = [ { name = "websockets" }, ] -[package.dev-dependencies] -dev = [ - { name = "coverage", extra = ["toml"] }, - { name = "dirty-equals" }, - { name = "inline-snapshot" }, - { name = "logfire" }, - { name = "mcp", extra = ["cli", "ws"] }, - { name = "pillow" }, - { name = "pyright" }, - { name = "pytest" }, - { name = "pytest-examples" }, - { name = "pytest-flakefinder" }, - { name = "pytest-pretty" }, - { name = "pytest-xdist" }, - { name = "ruff" }, - { name = "strict-no-cover" }, - { name = "trio" }, -] -docs = [ - { name = "mkdocs" }, - { name = "mkdocs-gen-files" }, - { name = "mkdocs-glightbox" }, - { name = "mkdocs-literate-nav" }, - { name = "mkdocs-material", extra = ["imaging"] }, - { name = "mkdocstrings-python" }, -] - [package.metadata] requires-dist = [ { name = "anyio", specifier = ">=4.9" }, { name = "httpx", specifier = ">=0.27.1,<1.0.0" }, { name = "httpx-sse", specifier = ">=0.4" }, { name = "jsonschema", specifier = ">=4.20.0" }, + { name = "mcp-types", editable = "src/mcp-types" }, { name = "opentelemetry-api", specifier = ">=1.28.0" }, { name = "pydantic", specifier = ">=2.12.0" }, { name = "pydantic-settings", specifier = ">=2.5.2" }, @@ -930,33 +933,6 @@ requires-dist = [ ] provides-extras = ["cli", "rich", "ws"] -[package.metadata.requires-dev] -dev = [ - { name = "coverage", extras = ["toml"], specifier = ">=7.10.7,<=7.13" }, - { name = "dirty-equals", specifier = ">=0.9.0" }, - { name = "inline-snapshot", specifier = ">=0.23.0" }, - { name = "logfire", specifier = ">=3.0.0" }, - { name = "mcp", extras = ["cli", "ws"], editable = "." }, - { name = "pillow", specifier = ">=12.0" }, - { name = "pyright", specifier = ">=1.1.400" }, - { name = "pytest", specifier = ">=8.4.0" }, - { name = "pytest-examples", specifier = ">=0.0.14" }, - { name = "pytest-flakefinder", specifier = ">=1.1.0" }, - { name = "pytest-pretty", specifier = ">=1.2.0" }, - { name = "pytest-xdist", specifier = ">=3.6.1" }, - { name = "ruff", specifier = ">=0.8.5" }, - { name = "strict-no-cover", git = "https://github.com/pydantic/strict-no-cover" }, - { name = "trio", specifier = ">=0.26.2" }, -] -docs = [ - { name = "mkdocs", specifier = ">=1.6.1" }, - { name = "mkdocs-gen-files", specifier = ">=0.5.0" }, - { name = "mkdocs-glightbox", specifier = ">=0.4.0" }, - { name = "mkdocs-literate-nav", specifier = ">=0.6.1" }, - { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.5.45" }, - { name = "mkdocstrings-python", specifier = ">=2.0.1" }, -] - [[package]] name = "mcp-everything-server" version = "0.1.0" @@ -982,7 +958,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1021,7 +997,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "pydantic", specifier = ">=2.0" }, { name = "pydantic-settings", specifier = ">=2.5.2" }, { name = "sse-starlette", specifier = ">=1.6.1" }, @@ -1054,7 +1030,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.2.0" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1083,7 +1059,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "python-dotenv", specifier = ">=1.0.0" }, { name = "uvicorn", specifier = ">=0.32.1" }, ] @@ -1118,7 +1094,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1151,7 +1127,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1184,7 +1160,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1219,7 +1195,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1256,7 +1232,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1290,7 +1266,7 @@ dev = [ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.0" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1319,7 +1295,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.0" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1350,7 +1326,7 @@ dev = [ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.0" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1379,7 +1355,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.0" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1411,7 +1387,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1430,7 +1406,7 @@ dependencies = [ ] [package.metadata] -requires-dist = [{ name = "mcp", editable = "." }] +requires-dist = [{ name = "mcp", editable = "src/mcp" }] [[package]] name = "mcp-sse-polling-client" @@ -1451,7 +1427,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.2.0" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, ] [package.metadata.requires-dev] @@ -1486,7 +1462,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp", editable = "src/mcp" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1507,7 +1483,21 @@ dependencies = [ ] [package.metadata] -requires-dist = [{ name = "mcp", editable = "." }] +requires-dist = [{ name = "mcp", editable = "src/mcp" }] + +[[package]] +name = "mcp-types" +source = { editable = "src/mcp-types" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] + +[package.metadata] +requires-dist = [ + { name = "pydantic", specifier = ">=2.12.0" }, + { name = "typing-extensions", specifier = ">=4.13.0" }, +] [[package]] name = "mdurl"