mcp-proxy-adapter 6.2.32__py3-none-any.whl → 6.2.34__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,8 +8,7 @@ Author: Vasiliy Zdanovskiy
8
8
  email: vasilyvz@gmail.com
9
9
  """
10
10
 
11
- import logging
12
- from typing import Dict, Any, Optional, Callable, Awaitable
11
+ from typing import Dict, Any, Callable, Awaitable
13
12
  from fastapi import Request, Response
14
13
  from starlette.middleware.base import BaseHTTPMiddleware
15
14
 
@@ -17,23 +16,25 @@ from mcp_proxy_adapter.core.logging import logger
17
16
 
18
17
  # Import mcp_security_framework components
19
18
  try:
20
- from mcp_security_framework import AuthManager
21
- from mcp_security_framework.schemas.config import AuthConfig
19
+ from mcp_security_framework import AuthManager, PermissionManager
20
+ from mcp_security_framework.schemas.config import (
21
+ AuthConfig, PermissionConfig
22
+ )
22
23
  _MCP_SECURITY_AVAILABLE = True
23
24
  print("✅ mcp_security_framework available in middleware")
24
25
  except ImportError:
25
26
  _MCP_SECURITY_AVAILABLE = False
26
- print("⚠️ mcp_security_framework not available in middleware, using basic auth")
27
+ print("⚠️ mcp_security_framework not available in middleware, "
28
+ "using basic auth")
27
29
 
28
30
 
29
31
  class UserInfoMiddleware(BaseHTTPMiddleware):
30
32
  """
31
33
  Middleware for setting user information in request.state.
32
-
34
+
33
35
  This middleware extracts user information from authentication headers
34
36
  and sets it in request.state for use by commands.
35
37
  """
36
-
37
38
  def __init__(self, app, config: Dict[str, Any]):
38
39
  """
39
40
  Initialize user info middleware.
@@ -54,6 +55,7 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
54
55
  # Get API keys configuration
55
56
  security_config = config.get("security", {})
56
57
  auth_config = security_config.get("auth", {})
58
+ permissions_config = security_config.get("permissions", {})
57
59
 
58
60
  # Create AuthConfig for mcp_security_framework
59
61
  mcp_auth_config = AuthConfig(
@@ -62,8 +64,34 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
62
64
  api_keys=auth_config.get("api_keys", {})
63
65
  )
64
66
 
65
- self.auth_manager = AuthManager(mcp_auth_config)
66
- logger.info("✅ User info middleware initialized with mcp_security_framework")
67
+ # Create PermissionConfig for mcp_security_framework
68
+ mcp_permission_config = PermissionConfig(
69
+ roles_file=permissions_config.get("roles_file"),
70
+ default_role=permissions_config.get("default_role", "guest"),
71
+ admin_role=permissions_config.get("admin_role", "admin"),
72
+ role_hierarchy=permissions_config.get("role_hierarchy", {}),
73
+ permission_cache_enabled=permissions_config.get(
74
+ "permission_cache_enabled", True
75
+ ),
76
+ permission_cache_ttl=permissions_config.get(
77
+ "permission_cache_ttl", 300
78
+ ),
79
+ wildcard_permissions=permissions_config.get(
80
+ "wildcard_permissions", False
81
+ ),
82
+ strict_mode=permissions_config.get("strict_mode", True),
83
+ roles=permissions_config.get("roles", {})
84
+ )
85
+
86
+ # Initialize PermissionManager first
87
+ self.permission_manager = PermissionManager(mcp_permission_config)
88
+
89
+ # Initialize AuthManager with permission_manager
90
+ self.auth_manager = AuthManager(
91
+ mcp_auth_config, self.permission_manager
92
+ )
93
+ logger.info("✅ User info middleware initialized with "
94
+ "mcp_security_framework")
67
95
  except Exception as e:
68
96
  logger.warning(f"⚠️ Failed to initialize AuthManager: {e}")
69
97
  self._security_available = False
@@ -74,21 +102,23 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
74
102
  auth_config = security_config.get("auth", {})
75
103
  self.api_keys = auth_config.get("api_keys", {})
76
104
  logger.info("ℹ️ User info middleware initialized with basic auth")
77
-
78
- async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response:
105
+
106
+ async def dispatch(
107
+ self, request: Request,
108
+ call_next: Callable[[Request], Awaitable[Response]]
109
+ ) -> Response:
79
110
  """
80
111
  Process request and set user info in request.state.
81
-
112
+
82
113
  Args:
83
114
  request: Request object
84
115
  call_next: Next handler
85
-
116
+
86
117
  Returns:
87
118
  Response object
88
119
  """
89
120
  # Extract API key from headers
90
121
  api_key = request.headers.get("X-API-Key")
91
-
92
122
  if api_key:
93
123
  if self.auth_manager and self._security_available:
94
124
  try:
@@ -99,11 +129,16 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
99
129
  # Set user info from AuthManager result
100
130
  request.state.user = {
101
131
  "id": api_key,
102
- "role": auth_result.roles[0] if auth_result.roles else "guest",
132
+ "role": (auth_result.roles[0]
133
+ if auth_result.roles else "guest"),
103
134
  "roles": auth_result.roles or ["guest"],
104
- "permissions": getattr(auth_result, 'permissions', ["read"])
135
+ "permissions": getattr(
136
+ auth_result, 'permissions', ["read"]
137
+ )
105
138
  }
106
- logger.debug(f"✅ Authenticated user with mcp_security_framework: {request.state.user}")
139
+ logger.debug(f"✅ Authenticated user with "
140
+ f"mcp_security_framework: "
141
+ f"{request.state.user}")
107
142
  else:
108
143
  # Authentication failed
109
144
  request.state.user = {
@@ -112,9 +147,11 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
112
147
  "roles": ["guest"],
113
148
  "permissions": ["read"]
114
149
  }
115
- logger.debug(f"❌ Authentication failed for API key: {api_key[:8]}...")
150
+ logger.debug(f"❌ Authentication failed for API key: "
151
+ f"{api_key[:8]}...")
116
152
  except Exception as e:
117
- logger.warning(f"⚠️ AuthManager error: {e}, falling back to basic auth")
153
+ logger.warning(f"⚠️ AuthManager error: {e}, "
154
+ f"falling back to basic auth")
118
155
  self._security_available = False
119
156
 
120
157
  if not self._security_available:
@@ -124,8 +161,12 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
124
161
 
125
162
  # Get permissions for this role from roles file if available
126
163
  role_permissions = ["read"] # default permissions
127
- if hasattr(self, 'roles_config') and self.roles_config and user_role in self.roles_config:
128
- role_permissions = self.roles_config[user_role].get("permissions", ["read"])
164
+ if (hasattr(self, 'roles_config') and
165
+ self.roles_config and
166
+ user_role in self.roles_config):
167
+ role_permissions = self.roles_config[user_role].get(
168
+ "permissions", ["read"]
169
+ )
129
170
 
130
171
  # Set user info in request.state
131
172
  request.state.user = {
@@ -135,7 +176,8 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
135
176
  "permissions": role_permissions
136
177
  }
137
178
 
138
- logger.debug(f"✅ Authenticated user with basic auth: {request.state.user}")
179
+ logger.debug(f"✅ Authenticated user with basic auth: "
180
+ f"{request.state.user}")
139
181
  else:
140
182
  # API key not found
141
183
  request.state.user = {
@@ -154,5 +196,5 @@ class UserInfoMiddleware(BaseHTTPMiddleware):
154
196
  "permissions": ["read"]
155
197
  }
156
198
  logger.debug("ℹ️ No API key provided, using guest access")
157
-
199
+
158
200
  return await call_next(request)
@@ -119,7 +119,7 @@ class Config:
119
119
  "server_id": "mcp_proxy_adapter",
120
120
  "server_name": "MCP Proxy Adapter",
121
121
  "description": "JSON-RPC API for interacting with MCP Proxy",
122
- "version": "6.2.32",
122
+ "version": "6.2.33",
123
123
  "registration_timeout": 30,
124
124
  "retry_attempts": 3,
125
125
  "retry_delay": 5,
@@ -24,7 +24,7 @@ from requests.exceptions import RequestException
24
24
 
25
25
  # Import security framework components
26
26
  try:
27
- from mcp_security_framework import SecurityManager, AuthManager, CertificateManager
27
+ from mcp_security_framework import SecurityManager, AuthManager, CertificateManager, PermissionManager
28
28
  from mcp_security_framework.utils import generate_api_key, create_jwt_token, validate_jwt_token
29
29
  from mcp_security_framework.utils import extract_roles_from_cert, validate_certificate_chain
30
30
  from mcp_security_framework.utils import create_ssl_context, validate_server_certificate
@@ -85,9 +85,13 @@ class UniversalClient:
85
85
  # Initialize security manager
86
86
  self.security_manager = SecurityManager(self.security_config)
87
87
 
88
- # Initialize auth manager
88
+ # Initialize permission manager first
89
+ permissions_config = self.security_config.get("permissions", {})
90
+ self.permission_manager = PermissionManager(permissions_config)
91
+
92
+ # Initialize auth manager with permission_manager
89
93
  auth_config = self.security_config.get("auth", {})
90
- self.auth_manager = AuthManager(auth_config)
94
+ self.auth_manager = AuthManager(auth_config, self.permission_manager)
91
95
 
92
96
  # Initialize certificate manager
93
97
  cert_config = self.security_config.get("certificates", {})
@@ -49,7 +49,7 @@ class ProxyRegistrationManager:
49
49
  self.registration_config = config.get("registration", config.get("proxy_registration", {}))
50
50
 
51
51
  # Basic registration settings
52
- self.proxy_url = self.registration_config.get("proxy_url", self.registration_config.get("server_url", "https://proxy-registry.example.com"))
52
+ self.proxy_url = self.registration_config.get("proxy_url", "https://proxy-registry.example.com")
53
53
  self.server_id = self.registration_config.get("server_id", self.registration_config.get("proxy_info", {}).get("name", "mcp_proxy_adapter"))
54
54
  self.server_name = self.registration_config.get("server_name", self.registration_config.get("proxy_info", {}).get("name", "MCP Proxy Adapter"))
55
55
  self.description = self.registration_config.get("description", self.registration_config.get("proxy_info", {}).get("description", "JSON-RPC API for interacting with MCP Proxy"))
@@ -19,7 +19,7 @@ import requests
19
19
  from requests.exceptions import RequestException
20
20
  # Import security framework components
21
21
  try:
22
- from mcp_security_framework import SecurityManager, AuthManager, CertificateManager
22
+ from mcp_security_framework import SecurityManager, AuthManager, CertificateManager, PermissionManager
23
23
  from mcp_security_framework.utils import generate_api_key, create_jwt_token, validate_jwt_token
24
24
  from mcp_security_framework.utils import extract_roles_from_cert, validate_certificate_chain
25
25
  from mcp_security_framework.utils import create_ssl_context, validate_server_certificate
@@ -69,9 +69,12 @@ class UniversalClient:
69
69
  try:
70
70
  # Initialize security manager
71
71
  self.security_manager = SecurityManager(self.security_config)
72
- # Initialize auth manager
72
+ # Initialize permission manager first
73
+ permissions_config = self.security_config.get("permissions", {})
74
+ self.permission_manager = PermissionManager(permissions_config)
75
+ # Initialize auth manager with permission_manager
73
76
  auth_config = self.security_config.get("auth", {})
74
- self.auth_manager = AuthManager(auth_config)
77
+ self.auth_manager = AuthManager(auth_config, self.permission_manager)
75
78
  # Initialize certificate manager
76
79
  cert_config = self.security_config.get("certificates", {})
77
80
  self.cert_manager = CertificateManager(cert_config)
@@ -2,5 +2,5 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.2.32"
5
+ __version__ = "6.2.34"
6
6
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.2.32
3
+ Version: 6.2.34
4
4
  Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
5
5
  Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
6
  Author: Vasiliy Zdanovskiy
@@ -1,10 +1,10 @@
1
1
  mcp_proxy_adapter/__init__.py,sha256=B7m1YWyv_Wb87-Q-JqVpHQgwajnfIgDyZ_iIxzdTbBY,1021
2
2
  mcp_proxy_adapter/__main__.py,sha256=-Wp1myP9DzJNB9j97mj62C8kFk5YUbCmd0e7Rnwte0A,769
3
- mcp_proxy_adapter/config.py,sha256=C1CA-o7IhUdnklmI1h7tgfYVkMyTV2ST3jvlPnhkI64,21600
3
+ mcp_proxy_adapter/config.py,sha256=QIOV57A_hwDH2z_BVEBJKDsPpa3IUKlqhRAij4bpQik,21600
4
4
  mcp_proxy_adapter/custom_openapi.py,sha256=jYUrCy8C1mShh3sjKj-JkzSMLAvxDLTvtzSJFj5HUNg,15023
5
5
  mcp_proxy_adapter/main.py,sha256=9qt_pEQdq8roUc73CumfDn6jDWP_NyfdE1lCGEynv5I,2841
6
6
  mcp_proxy_adapter/openapi.py,sha256=36vOEbJjGnVZR6hUhl6mHCD29HYOEFKo2bL0JdGSm-4,13952
7
- mcp_proxy_adapter/version.py,sha256=vhjtZ1Yb2aJqQRwY96rTG9HSzJesFzSpX6gIRZqZf_g,76
7
+ mcp_proxy_adapter/version.py,sha256=8Rv-tnRMFu7W1xVGrsKl9PqMpFzjts8hLs89BkGcJHw,76
8
8
  mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  mcp_proxy_adapter/api/app.py,sha256=khl4kaI4mJ6dNbfAK7hR97Ek-eWC9NBeuXHr6GVbLoU,28911
10
10
  mcp_proxy_adapter/api/handlers.py,sha256=DcZT7MVBV33q-0EJ0iFqxE0VgBkFt6d_SqoRkntwyvc,8477
@@ -21,7 +21,7 @@ mcp_proxy_adapter/api/middleware/performance.py,sha256=dHBxTF43LEGXMKHMH3A8ybKmw
21
21
  mcp_proxy_adapter/api/middleware/protocol_middleware.py,sha256=iVjJrTEfKy15ZchQUo-Mu0hBg9kEP6vgzee_3PtWd6M,8115
22
22
  mcp_proxy_adapter/api/middleware/transport_middleware.py,sha256=Esy2gGKpEV5RoUTilr1YKKTDc5jh5RxsomD0VXyR2pE,4396
23
23
  mcp_proxy_adapter/api/middleware/unified_security.py,sha256=fDWUeIuHjYUngVnB8gVR9ES3IQSaY9VP2YPZGXATJlU,7617
24
- mcp_proxy_adapter/api/middleware/user_info_middleware.py,sha256=CWZvwUqieNhC8_ArTvncRjFfU3RHusO-dMcUSvRv01A,6311
24
+ mcp_proxy_adapter/api/middleware/user_info_middleware.py,sha256=gJX5WUMa-ByWpbvbFUftymH3BuQNaj1h1lGDqq9VU6g,8134
25
25
  mcp_proxy_adapter/commands/__init__.py,sha256=r791wg4FKhWSi5rqA3vekDcGf5kr18pwF1woX-dnZKo,1525
26
26
  mcp_proxy_adapter/commands/auth_validation_command.py,sha256=z612WJDVgZwaCrxdQhATwRc5i3qxH37MPuIV6SuZPn8,15083
27
27
  mcp_proxy_adapter/commands/base.py,sha256=tunyrmt-LYJMQZslAZQor3KZvOrn1IYNpL5uOAnSdxc,15791
@@ -57,7 +57,7 @@ mcp_proxy_adapter/core/app_factory.py,sha256=Xwyz40GNOWWa7ThArweawNBY4WI4bEI3_cj
57
57
  mcp_proxy_adapter/core/app_runner.py,sha256=JPpx9rKmaHAVdFnHRl2rXycptQkTSQ13Er7Qf1KZIA4,10614
58
58
  mcp_proxy_adapter/core/auth_validator.py,sha256=lJxBVkoQWSk5CNtnPYMEJSsz4FhcXK-gB5QJ_OP9jEE,20937
59
59
  mcp_proxy_adapter/core/certificate_utils.py,sha256=7VOhjRcygCToYgPTUt_MgcNILdpRBRBNZSFpeS_QrfA,39541
60
- mcp_proxy_adapter/core/client.py,sha256=YxtaHvMoqKcjWJ-2mf2FH22wUGWUZjXMEKPqxypNOPE,21340
60
+ mcp_proxy_adapter/core/client.py,sha256=AeNjMyaTnnR0g6Sw_c28X_le8o5SbEi-_PaRtVttGWQ,21624
61
61
  mcp_proxy_adapter/core/client_manager.py,sha256=sKEhapMpogqb54WIWEpz2bMjrX3wvYooX-a844IfCTU,9164
62
62
  mcp_proxy_adapter/core/client_security.py,sha256=8isHpvv-7H85QzI8K3Pfyr_KdvpE2xYyIT4wqWrttNU,13575
63
63
  mcp_proxy_adapter/core/config_converter.py,sha256=FAA2zx-yRgqMgzg73o9Aq5CEEfodNCeaA8Yluto4wAs,16985
@@ -68,7 +68,7 @@ mcp_proxy_adapter/core/mtls_asgi.py,sha256=X2lAj3wk3L85amRCp_-10sqvZa5wJf_diXhwr
68
68
  mcp_proxy_adapter/core/mtls_asgi_app.py,sha256=VeolP08TTaqYU5fGeaZexj6EBWBDugoVrEGXzJW4PuM,6406
69
69
  mcp_proxy_adapter/core/protocol_manager.py,sha256=ISFRXjUuK4Q3uMbVB8-O_ozQSsDEH0PQA_HAKGeUrrw,14763
70
70
  mcp_proxy_adapter/core/proxy_client.py,sha256=n44T5iBS29y6E2lQLGKpOQxPYVrxIl98OAs6mMuhEsM,22916
71
- mcp_proxy_adapter/core/proxy_registration.py,sha256=OeSDjID-1ofJxRQhmzKGoXM6E-Pk0WmuUfMdsiSo2u0,19829
71
+ mcp_proxy_adapter/core/proxy_registration.py,sha256=Mmh-hWVJKkADLP8361Nx_SGFp9JRwtWnQtjuOhGx5Ss,19785
72
72
  mcp_proxy_adapter/core/role_utils.py,sha256=wMoTVz3gF5fM7jozNMwsEwPkp1tui26M-t_KH1Oz8gs,12880
73
73
  mcp_proxy_adapter/core/security_adapter.py,sha256=wZ3OH1WzhUdpN8N8CrGJSFFVNi474DqdazIqQ1T8PN4,13343
74
74
  mcp_proxy_adapter/core/security_factory.py,sha256=4r7qvBq30XfosGD_b1ZHyNVLN8rOQ3NAKuaCOCEK8jA,8262
@@ -100,7 +100,7 @@ mcp_proxy_adapter/examples/setup_test_environment.py,sha256=fAfz1U7qERY-Z9ly15Wl
100
100
  mcp_proxy_adapter/examples/test_config.py,sha256=1X9X8lNlWOcM1ZbIzteeMvLdgxnJEK_ev1BYTZiA9ws,6451
101
101
  mcp_proxy_adapter/examples/test_config_generator.py,sha256=SBKL0bv-kUwUUbwrFVbxuA_6pDvK2573Jxm9wPiyI8s,3927
102
102
  mcp_proxy_adapter/examples/test_examples.py,sha256=KH095FFEQDMKYZglclr5qy3cW__t3H8VX1l8dvCkQos,12132
103
- mcp_proxy_adapter/examples/universal_client.py,sha256=IIKGRa0__KoWVla3VnVl-RjkkG_nPpM8vglPm70pV9c,26948
103
+ mcp_proxy_adapter/examples/universal_client.py,sha256=qPwDWE33b_WMZCdNE25wRRxvSsMr2syOdeUlF1gUY-I,27219
104
104
  mcp_proxy_adapter/examples/basic_framework/__init__.py,sha256=4aYD--R6hy9n9CUxj7Osb9HcdVUMJ6_cfpu4ujkbCwI,345
105
105
  mcp_proxy_adapter/examples/basic_framework/main.py,sha256=cDmqeUN1lDBBwuwLjmnP3qIyofCZ3Jr5Ct7Im-qCsUU,1728
106
106
  mcp_proxy_adapter/examples/basic_framework/commands/__init__.py,sha256=_VQNLUEdsxUG-4yt9BZI_vtOxHAdGG0OUSsP6Wj-Vz4,76
@@ -134,9 +134,9 @@ mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py,sha256=J0
134
134
  mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI6Cf3fyIvOT9dc,2881
135
135
  mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
136
136
  mcp_proxy_adapter/utils/config_generator.py,sha256=2dxwBh9k_nUw9kgytZso5TNOQpBqd3c-RpKSTLoHlLE,46465
137
- mcp_proxy_adapter-6.2.32.dist-info/licenses/LICENSE,sha256=6KdtUcTwmTRbJrAmYjVn7e6S-V42ubeDJ-AiVEzZ510,1075
138
- mcp_proxy_adapter-6.2.32.dist-info/METADATA,sha256=BVnNC6hX9Oqb-DILZ7UOpyxGlaeuNgRxbT0czZVJY8o,22348
139
- mcp_proxy_adapter-6.2.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
140
- mcp_proxy_adapter-6.2.32.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
141
- mcp_proxy_adapter-6.2.32.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
142
- mcp_proxy_adapter-6.2.32.dist-info/RECORD,,
137
+ mcp_proxy_adapter-6.2.34.dist-info/licenses/LICENSE,sha256=6KdtUcTwmTRbJrAmYjVn7e6S-V42ubeDJ-AiVEzZ510,1075
138
+ mcp_proxy_adapter-6.2.34.dist-info/METADATA,sha256=l0uENuXxZKqEOdMXaaMBnEWWegRTQDO9CJYiNGWGIhA,22348
139
+ mcp_proxy_adapter-6.2.34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
140
+ mcp_proxy_adapter-6.2.34.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
141
+ mcp_proxy_adapter-6.2.34.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
142
+ mcp_proxy_adapter-6.2.34.dist-info/RECORD,,