Skip to content

Commit dd8c5ca

Browse files
Merge pull request #105 from Agent-Hellboy/improve_typing
Change typing according to 3.10
2 parents 07f725a + 12e1362 commit dd8c5ca

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+495
-696
lines changed

mcp_fuzzer/auth/loaders.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import json
22
import os
3-
from typing import Dict
43

54
from .manager import AuthManager
65
from .providers import (
@@ -10,7 +9,6 @@
109
create_custom_header_auth,
1110
)
1211

13-
1412
def setup_auth_from_env() -> AuthManager:
1513
auth_manager = AuthManager()
1614

@@ -32,7 +30,7 @@ def setup_auth_from_env() -> AuthManager:
3230
try:
3331
headers_json = json.loads(custom_headers)
3432
if isinstance(headers_json, dict):
35-
headers: Dict[str, str] = {
33+
headers: dict[str, str] = {
3634
str(k): str(v) for k, v in headers_json.items()
3735
}
3836
auth_manager.add_auth_provider(
@@ -55,7 +53,6 @@ def setup_auth_from_env() -> AuthManager:
5553

5654
return auth_manager
5755

58-
5956
def load_auth_config(config_file: str) -> AuthManager:
6057
auth_manager = AuthManager()
6158

@@ -95,7 +92,7 @@ def load_auth_config(config_file: str) -> AuthManager:
9592
headers = provider_config.get("headers")
9693
if not isinstance(headers, dict):
9794
raise ValueError(f"Provider '{name}' custom headers must be a dict")
98-
headers_str: Dict[str, str] = {str(k): str(v) for k, v in headers.items()}
95+
headers_str: dict[str, str] = {str(k): str(v) for k, v in headers.items()}
9996
auth_manager.add_auth_provider(name, create_custom_header_auth(headers_str))
10097
else:
10198
raise ValueError(f"Unknown provider type: {provider_type}")

mcp_fuzzer/auth/manager.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,33 @@
1-
from typing import Any, Dict, Optional
1+
from typing import Any
22

33
from .providers import AuthProvider
44

5-
65
class AuthManager:
76
"""Manages authentication for different tools and services."""
87

98
def __init__(self):
10-
self.auth_providers: Dict[str, AuthProvider] = {}
11-
self.tool_auth_mapping: Dict[str, str] = {}
9+
self.auth_providers: dict[str, AuthProvider] = {}
10+
self.tool_auth_mapping: dict[str, str] = {}
1211

1312
def add_auth_provider(self, name: str, provider: AuthProvider):
1413
self.auth_providers[name] = provider
1514

1615
def map_tool_to_auth(self, tool_name: str, auth_provider_name: str):
1716
self.tool_auth_mapping[tool_name] = auth_provider_name
1817

19-
def get_auth_for_tool(self, tool_name: str) -> Optional[AuthProvider]:
18+
def get_auth_for_tool(self, tool_name: str) -> AuthProvider | None:
2019
auth_provider_name = self.tool_auth_mapping.get(tool_name)
2120
if auth_provider_name:
2221
return self.auth_providers.get(auth_provider_name)
2322
return None
2423

25-
def get_auth_headers_for_tool(self, tool_name: str) -> Dict[str, str]:
24+
def get_auth_headers_for_tool(self, tool_name: str) -> dict[str, str]:
2625
provider = self.get_auth_for_tool(tool_name)
2726
if provider:
2827
return provider.get_auth_headers()
2928
return {}
3029

31-
def get_auth_params_for_tool(self, tool_name: str) -> Dict[str, Any]:
30+
def get_auth_params_for_tool(self, tool_name: str) -> dict[str, Any]:
3231
provider = self.get_auth_for_tool(tool_name)
3332
if provider:
3433
return provider.get_auth_params()

mcp_fuzzer/auth/providers.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,69 @@
11
import base64
22
from abc import ABC, abstractmethod
3-
from typing import Any, Dict
4-
3+
from typing import Any
54

65
class AuthProvider(ABC):
76
@abstractmethod
8-
def get_auth_headers(self) -> Dict[str, str]:
7+
def get_auth_headers(self) -> dict[str, str]:
98
pass
109

1110
@abstractmethod
12-
def get_auth_params(self) -> Dict[str, Any]:
11+
def get_auth_params(self) -> dict[str, Any]:
1312
pass
1413

15-
1614
class APIKeyAuth(AuthProvider):
1715
def __init__(self, api_key: str, header_name: str = "Authorization"):
1816
self.api_key = api_key
1917
self.header_name = header_name
2018

21-
def get_auth_headers(self) -> Dict[str, str]:
19+
def get_auth_headers(self) -> dict[str, str]:
2220
return {self.header_name: f"Bearer {self.api_key}"}
2321

24-
def get_auth_params(self) -> Dict[str, Any]:
22+
def get_auth_params(self) -> dict[str, Any]:
2523
return {}
2624

27-
2825
class BasicAuth(AuthProvider):
2926
def __init__(self, username: str, password: str):
3027
self.username = username
3128
self.password = password
3229

33-
def get_auth_headers(self) -> Dict[str, str]:
30+
def get_auth_headers(self) -> dict[str, str]:
3431
credentials = f"{self.username}:{self.password}"
3532
encoded = base64.b64encode(credentials.encode()).decode()
3633
return {"Authorization": f"Basic {encoded}"}
3734

38-
def get_auth_params(self) -> Dict[str, Any]:
35+
def get_auth_params(self) -> dict[str, Any]:
3936
return {}
4037

41-
4238
class OAuthTokenAuth(AuthProvider):
4339
def __init__(self, token: str, token_type: str = "Bearer"):
4440
self.token = token
4541
self.token_type = token_type
4642

47-
def get_auth_headers(self) -> Dict[str, str]:
43+
def get_auth_headers(self) -> dict[str, str]:
4844
return {"Authorization": f"{self.token_type} {self.token}"}
4945

50-
def get_auth_params(self) -> Dict[str, Any]:
46+
def get_auth_params(self) -> dict[str, Any]:
5147
return {}
5248

53-
5449
class CustomHeaderAuth(AuthProvider):
55-
def __init__(self, headers: Dict[str, str]):
50+
def __init__(self, headers: dict[str, str]):
5651
self.headers = dict(headers)
5752

58-
def get_auth_headers(self) -> Dict[str, str]:
53+
def get_auth_headers(self) -> dict[str, str]:
5954
return dict(self.headers)
6055

61-
def get_auth_params(self) -> Dict[str, Any]:
56+
def get_auth_params(self) -> dict[str, Any]:
6257
return {}
6358

64-
6559
def create_api_key_auth(api_key: str, header_name: str = "Authorization") -> APIKeyAuth:
6660
return APIKeyAuth(api_key, header_name)
6761

68-
6962
def create_basic_auth(username: str, password: str) -> BasicAuth:
7063
return BasicAuth(username, password)
7164

72-
7365
def create_oauth_auth(token: str, token_type: str = "Bearer") -> OAuthTokenAuth:
7466
return OAuthTokenAuth(token, token_type)
7567

76-
77-
def create_custom_header_auth(headers: Dict[str, str]) -> CustomHeaderAuth:
68+
def create_custom_header_auth(headers: dict[str, str]) -> CustomHeaderAuth:
7869
return CustomHeaderAuth(headers)

mcp_fuzzer/cli/args.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import argparse
33
import logging
44
import sys
5-
from typing import Any, Dict
5+
from typing import Any
66

77
from rich.console import Console
88

@@ -13,7 +13,6 @@
1313
)
1414
from ..config import config
1515

16-
1716
def create_argument_parser() -> argparse.ArgumentParser:
1817
parser = argparse.ArgumentParser(
1918
description="MCP Fuzzer - Comprehensive fuzzing for MCP servers",
@@ -354,12 +353,10 @@ def create_argument_parser() -> argparse.ArgumentParser:
354353

355354
return parser
356355

357-
358356
def parse_arguments() -> argparse.Namespace:
359357
parser = create_argument_parser()
360358
return parser.parse_args()
361359

362-
363360
def setup_logging(args: argparse.Namespace) -> None:
364361
if getattr(args, "log_level", None):
365362
level = getattr(logging, args.log_level)
@@ -381,8 +378,7 @@ def setup_logging(args: argparse.Namespace) -> None:
381378
logging.getLogger("urllib3").setLevel(logging.WARNING)
382379
logging.getLogger("psutil").setLevel(logging.WARNING)
383380

384-
385-
def build_unified_client_args(args: argparse.Namespace) -> Dict[str, Any]:
381+
def build_unified_client_args(args: argparse.Namespace) -> dict[str, Any]:
386382
client_args = {
387383
"mode": args.mode,
388384
"phase": args.phase,
@@ -442,7 +438,6 @@ def build_unified_client_args(args: argparse.Namespace) -> Dict[str, Any]:
442438

443439
return client_args
444440

445-
446441
def print_startup_info(args: argparse.Namespace) -> None:
447442
# Resolve Console via package so tests can patch mcp_fuzzer.cli.Console
448443
cli_module = sys.modules.get("mcp_fuzzer.cli")
@@ -452,8 +447,7 @@ def print_startup_info(args: argparse.Namespace) -> None:
452447
console.print(f"Protocol: {args.protocol.upper()}")
453448
console.print(f"Endpoint: {args.endpoint}")
454449

455-
456-
def get_cli_config() -> Dict[str, Any]:
450+
def get_cli_config() -> dict[str, Any]:
457451
"""Get CLI configuration as a dictionary for external callers/tests.
458452
459453
Resolve helpers through the package namespace so unit tests patching
@@ -590,7 +584,6 @@ def get_cli_config() -> Dict[str, Any]:
590584
"export_markdown": getattr(args, "export_markdown", None),
591585
}
592586

593-
594587
def validate_arguments(args: argparse.Namespace) -> None:
595588
# Check if this is a utility command that doesn't need endpoint
596589
is_utility_command = (

mcp_fuzzer/cli/runner.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
import os
44
import signal
55
import sys
6-
from typing import Any, Dict, List
6+
from typing import Any
77

88
from rich.console import Console
99

1010
from ..transport import create_transport
1111
from ..safety_system.policy import configure_network_policy
1212
from ..safety_system import start_system_blocking, stop_system_blocking
1313

14-
15-
def create_transport_with_auth(args, client_args: Dict[str, Any]):
14+
def create_transport_with_auth(args, client_args: dict[str, Any]):
1615
try:
1716
auth_headers = None
1817
if client_args.get("auth_manager"):
@@ -33,9 +32,8 @@ def create_transport_with_auth(args, client_args: Dict[str, Any]):
3332
console.print(f"[bold red]Unexpected error:[/bold red] {transport_error}")
3433
sys.exit(1)
3534

36-
37-
def prepare_inner_argv(args) -> List[str]:
38-
argv: List[str] = [sys.argv[0]]
35+
def prepare_inner_argv(args) -> list[str]:
36+
argv: list[str] = [sys.argv[0]]
3937
mode = args.mode
4038
argv += ["--mode", mode]
4139
argv += ["--protocol", args.protocol]
@@ -59,22 +57,19 @@ def prepare_inner_argv(args) -> List[str]:
5957
argv += ["--allow-host", h]
6058
return argv
6159

62-
6360
def start_safety_if_enabled(args) -> bool:
6461
if getattr(args, "enable_safety_system", False):
6562
start_system_blocking()
6663
return True
6764
return False
6865

69-
7066
def stop_safety_if_started(started: bool) -> None:
7167
if started:
7268
try:
7369
stop_system_blocking()
7470
except Exception:
7571
pass
7672

77-
7873
def execute_inner_client(args, unified_client_main, argv):
7974
old_argv = sys.argv
8075
sys.argv = argv
@@ -177,7 +172,6 @@ def _cancel_all_tasks(): # pragma: no cover
177172
if should_exit:
178173
raise SystemExit(130)
179174

180-
181175
def run_with_retry_on_interrupt(args, unified_client_main, argv) -> None:
182176
try:
183177
execute_inner_client(args, unified_client_main, argv)

mcp_fuzzer/client/__init__.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
"""
77

88
import logging
9-
from typing import List, Optional
109

1110
import emoji
1211

@@ -17,8 +16,7 @@
1716
# For backward compatibility
1817
UnifiedMCPFuzzerClient = MCPFuzzerClient
1918

20-
21-
async def main(argv: Optional[List[str]] = None) -> int:
19+
async def main(argv: list[str] | None = None) -> int:
2220
"""Main entry point for the CLI application.
2321
2422
Args:
@@ -245,5 +243,4 @@ async def main(argv: Optional[List[str]] = None) -> int:
245243
# Ensure proper shutdown
246244
await client.cleanup()
247245

248-
249246
__all__ = ["MCPFuzzerClient", "UnifiedMCPFuzzerClient", "main"]

mcp_fuzzer/client/base.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
"""
77

88
import logging
9-
from typing import Optional
109

1110
from ..auth import AuthManager
1211
from ..reports import FuzzerReporter
@@ -15,7 +14,6 @@
1514
from .tool_client import ToolClient
1615
from .protocol_client import ProtocolClient
1716

18-
1917
class MCPFuzzerClient:
2018
"""
2119
Main client for fuzzing MCP servers.
@@ -27,10 +25,10 @@ class MCPFuzzerClient:
2725
def __init__(
2826
self,
2927
transport,
30-
auth_manager: Optional[AuthManager] = None,
31-
tool_timeout: Optional[float] = None,
32-
reporter: Optional[FuzzerReporter] = None,
33-
safety_system: Optional[SafetyProvider] = None,
28+
auth_manager: AuthManager | None = None,
29+
tool_timeout: float | None = None,
30+
reporter: FuzzerReporter | None = None,
31+
safety_system: SafetyProvider | None = None,
3432
max_concurrency: int = 5,
3533
):
3634
"""

0 commit comments

Comments
 (0)