Skip to content

Commit 5d80f4e

Browse files
authored
refactor: move inline imports to module level (#1893)
1 parent c063621 commit 5d80f4e

24 files changed

+58
-122
lines changed

src/mcp/client/__main__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import argparse
22
import logging
33
import sys
4+
import warnings
45
from functools import partial
56
from urllib.parse import urlparse
67

@@ -15,8 +16,6 @@
1516
from mcp.shared.session import RequestResponder
1617

1718
if not sys.warnoptions:
18-
import warnings
19-
2019
warnings.simplefilter("ignore")
2120

2221
logging.basicConfig(level=logging.INFO)

src/mcp/client/auth/extensions/client_credentials.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"""
1010

1111
import time
12+
import warnings
1213
from collections.abc import Awaitable, Callable
1314
from typing import Any, Literal
1415
from uuid import uuid4
@@ -409,8 +410,6 @@ def __init__(
409410
timeout: float = 300.0,
410411
jwt_parameters: JWTParameters | None = None,
411412
) -> None:
412-
import warnings
413-
414413
warnings.warn(
415414
"RFC7523OAuthClientProvider is deprecated. Use ClientCredentialsOAuthProvider "
416415
"or PrivateKeyJWTOAuthProvider instead.",

src/mcp/server/__main__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import importlib.metadata
22
import logging
33
import sys
4+
import warnings
45

56
import anyio
67

@@ -10,8 +11,6 @@
1011
from mcp.types import ServerCapabilities
1112

1213
if not sys.warnoptions:
13-
import warnings
14-
1514
warnings.simplefilter("ignore")
1615

1716
logging.basicConfig(level=logging.INFO)

src/mcp/server/lowlevel/server.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ async def main():
7474
import warnings
7575
from collections.abc import AsyncIterator, Awaitable, Callable, Iterable
7676
from contextlib import AbstractAsyncContextManager, AsyncExitStack, asynccontextmanager
77+
from importlib.metadata import version as importlib_version
7778
from typing import Any, Generic, TypeAlias, cast
7879

7980
import anyio
@@ -173,9 +174,7 @@ def create_initialization_options(
173174

174175
def pkg_version(package: str) -> str:
175176
try:
176-
from importlib.metadata import version
177-
178-
return version(package)
177+
return importlib_version(package)
179178
except Exception: # pragma: no cover
180179
pass
181180

tests/client/auth/extensions/test_client_credentials.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import urllib.parse
2+
import warnings
23

34
import jwt
45
import pytest
@@ -60,8 +61,6 @@ async def callback_handler() -> tuple[str, str | None]: # pragma: no cover
6061
"""Mock callback handler."""
6162
return "test_auth_code", "test_state"
6263

63-
import warnings
64-
6564
with warnings.catch_warnings():
6665
warnings.simplefilter("ignore", DeprecationWarning)
6766
return RFC7523OAuthClientProvider(

tests/client/test_auth.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import base64
66
import time
77
from unittest import mock
8-
from urllib.parse import unquote
8+
from urllib.parse import parse_qs, quote, unquote, urlparse
99

1010
import httpx
1111
import pytest
@@ -27,6 +27,8 @@
2727
is_valid_client_metadata_url,
2828
should_use_client_metadata_url,
2929
)
30+
from mcp.server.auth.routes import build_metadata
31+
from mcp.server.auth.settings import ClientRegistrationOptions, RevocationOptions
3032
from mcp.shared.auth import (
3133
OAuthClientInformationFull,
3234
OAuthClientMetadata,
@@ -758,8 +760,6 @@ async def test_resource_param_included_with_recent_protocol_version(self, oauth_
758760
content = request.content.decode()
759761
assert "resource=" in content
760762
# Check URL-encoded resource parameter
761-
from urllib.parse import quote
762-
763763
expected_resource = quote(oauth_provider.context.get_resource_url(), safe="")
764764
assert f"resource={expected_resource}" in content
765765

@@ -1226,8 +1226,6 @@ async def capture_redirect(url: str) -> None:
12261226
"%3A", ":"
12271227
).replace("+", " ")
12281228
# Extract state from redirect URL
1229-
from urllib.parse import parse_qs, urlparse
1230-
12311229
parsed = urlparse(url)
12321230
params = parse_qs(parsed.query)
12331231
captured_state = params.get("state", [None])[0]
@@ -1336,9 +1334,6 @@ def test_build_metadata(
13361334
registration_endpoint: str,
13371335
revocation_endpoint: str,
13381336
):
1339-
from mcp.server.auth.routes import build_metadata
1340-
from mcp.server.auth.settings import ClientRegistrationOptions, RevocationOptions
1341-
13421337
metadata = build_metadata(
13431338
issuer_url=AnyHttpUrl(issuer_url),
13441339
service_documentation_url=AnyHttpUrl(service_documentation_url),

tests/client/test_http_unicode.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,20 @@
77

88
import multiprocessing
99
import socket
10-
from collections.abc import Generator
10+
from collections.abc import AsyncGenerator, Generator
11+
from contextlib import asynccontextmanager
12+
from typing import Any
1113

1214
import pytest
15+
from starlette.applications import Starlette
16+
from starlette.routing import Mount
1317

18+
import mcp.types as types
1419
from mcp.client.session import ClientSession
1520
from mcp.client.streamable_http import streamable_http_client
21+
from mcp.server import Server
22+
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
23+
from mcp.types import TextContent, Tool
1624
from tests.test_helpers import wait_for_server
1725

1826
# Test constants with various Unicode characters
@@ -37,19 +45,7 @@
3745

3846
def run_unicode_server(port: int) -> None: # pragma: no cover
3947
"""Run the Unicode test server in a separate process."""
40-
# Import inside the function since this runs in a separate process
41-
from collections.abc import AsyncGenerator
42-
from contextlib import asynccontextmanager
43-
from typing import Any
44-
4548
import uvicorn
46-
from starlette.applications import Starlette
47-
from starlette.routing import Mount
48-
49-
import mcp.types as types
50-
from mcp.server import Server
51-
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
52-
from mcp.types import TextContent, Tool
5349

5450
# Need to recreate the server setup in this process
5551
server = Server(name="unicode_test_server")

tests/client/test_list_roots_callback.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from pydantic import FileUrl
33

44
from mcp.client.session import ClientSession
5+
from mcp.server.fastmcp import FastMCP
56
from mcp.server.fastmcp.server import Context
67
from mcp.server.session import ServerSession
78
from mcp.shared.context import RequestContext
@@ -13,8 +14,6 @@
1314

1415
@pytest.mark.anyio
1516
async def test_list_roots_callback():
16-
from mcp.server.fastmcp import FastMCP
17-
1817
server = FastMCP("test")
1918

2019
callback_return = ListRootsResult(

tests/client/test_logging_callback.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44

55
import mcp.types as types
6+
from mcp.server.fastmcp import FastMCP
67
from mcp.shared.memory import (
78
create_connected_server_and_client_session as create_session,
89
)
@@ -23,8 +24,6 @@ async def __call__(self, params: LoggingMessageNotificationParams) -> None:
2324

2425
@pytest.mark.anyio
2526
async def test_logging_callback():
26-
from mcp.server.fastmcp import FastMCP
27-
2827
server = FastMCP("test")
2928
logging_collector = LoggingCollector()
3029

tests/client/test_output_schema_validation.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import inspect
12
import logging
23
from contextlib import contextmanager
34
from typing import Any
45
from unittest.mock import patch
56

7+
import jsonschema
68
import pytest
79

810
from mcp.server.lowlevel import Server
@@ -19,15 +21,11 @@ def bypass_server_output_validation():
1921
This simulates a malicious or non-compliant server that doesn't validate
2022
its outputs, allowing us to test client-side validation.
2123
"""
22-
import jsonschema
23-
2424
# Save the original validate function
2525
original_validate = jsonschema.validate
2626

2727
# Create a mock that tracks which module is calling it
2828
def selective_mock(instance: Any = None, schema: Any = None, *args: Any, **kwargs: Any) -> None:
29-
import inspect
30-
3129
# Check the call stack to see where this is being called from
3230
for frame_info in inspect.stack():
3331
# If called from the server module, skip validation

0 commit comments

Comments
 (0)